---
title: "Up to 50 Robinhood Chain tokens in one call (BASIC+)"
method: POST
path: "/rhc/token/batch"
tags: ["Robinhood Chain"]
---

# Up to 50 Robinhood Chain tokens in one call (BASIC+)

`POST /rhc/token/batch`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/token/batch`
- Auth: HTTP bearer

Set-based batch read — three queries regardless of batch size, not a fan-out. Returns token metadata, price/MC/liquidity and deployer reputation. Deliberately does NOT compute buyer-quality (that is a per-token cohort computation; use `/rhc/tokens/batch/buyer-quality`) so a caller who only wants prices does not pay for it. Accepts `addresses` or `mints` so a ported Solana client works unchanged. **One entry is returned per REQUESTED address, in order** — unknown tokens come back as `found: false` rather than being silently omitted. Tier: **BASIC**.

## Request body

- object
  - `addresses` string[]: 0x EVM token addresses.
  - `mints` string[]: Alias for `addresses` (Solana-client compatibility).

## Response `200`

OK.

- object
  - `chain` 'robinhood'
  - `tokens` object[]
    - `address` string
    - `found` boolean
    - `status` 'ok' | 'no_price_yet' | 'mc_unavailable' | 'not_seen_yet': Why a price field is null: no_price_yet (seen, no priced trade yet), mc_unavailable (priced, MC failed the plausibility gate or supply unknown), not_seen_yet (found:false).
    - `hint` string: found:false only.
    - `symbol` string, nullable
    - `name` string, nullable
    - `decimals` integer, nullable
    - `launchpad` string, nullable
    - `is_graduated` boolean, nullable
    - `graduated_at` string, date-time, nullable
    - `first_seen_at` string, date-time, nullable
    - `price_usd` number, nullable
    - `market_cap_usd` number, nullable
    - `fdv_usd` number, nullable
    - `liquidity_usd` number, nullable
    - `peak_mc_usd` number, nullable
    - `liquidity_source` 'pool_balances' | 'v4_virtual_ceiling' | 'bonding_curve_reserve' | 'unknown_venue': Where liquidity_usd comes from: pool_balances = uniswap-v2/v3 pool token balances; v4_virtual_ceiling = uniswap-v4 virtual reserves clamped to the PoolManager (a ceiling); bonding_curve_reserve = 2x a launchpad curve quote reserve from contract state (pons-v2, flap, hood.fun, bags); unknown_venue = no recognised primary venue.
    - `liquidity_status` 'available' | 'verified_zero' | 'unavailable': available = positive figure; verified_zero = explicit 0 from chain state; unavailable = liquidity_usd is null (unknown, not yet measured, unresolved quote asset, or graduated curve awaiting its pool figure). Null never means zero.
    - `peak_mc_at` string, date-time, nullable
    - `primary_dex` string, nullable
    - `last_trade_time` string, date-time, nullable
    - `deployer` object, nullable: address + source, plus the deployer's reputation row (tier, tokens_deployed, graduated, graduation_rate, runners, runner_rate) when known.
  - `requested` integer
  - `found` integer

## Other responses

- `400`: Body must be { addresses: string[] } with 1-50 valid 0x addresses.
- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Forbidden. One of: the key's tier is below this endpoint's or parameter's gate (`tier_required` with an `upgrade` block); the public demo key used outside its allow-list (`demo_key_endpoint_not_allowed`); an invalid or revoked key; an origin-restricted key called from a disallowed origin (`code` `origin_not_allowed` / `origin_required`). `X-RateLimit-*` headers are present only on `tier_required`.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `503`: Temporarily unavailable — a Postgres statement timeout while the dataset is under load or maintenance (`statement_timeout`, with `X-RateLimit-*` and `_rid`), or the API-key lookup itself unavailable (`auth_backend_unavailable`, authentication stage: no `X-RateLimit-*`, no `_rid`, not counted as a failed authentication). Always carries `Retry-After`; honour it.

---

[API](https://skmtc.dev/madeonsol/apis/madeonsol-robinhood-chain-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-robinhood-chain-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-robinhood-chain-api/revisions/5db123bfc4d4?raw)
