---
title: "Peak market cap, drawdown and high-water curve for a Robinhood Chain token (PRO+)"
method: GET
path: "/rhc/tokens/{address}/peak-history"
tags: ["Robinhood Chain"]
---

# Peak market cap, drawdown and high-water curve for a Robinhood Chain token (PRO+)

`GET /rhc/tokens/{address}/peak-history`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/tokens/{address}/peak-history`
- Auth: HTTP bearer

Peak market cap, current drawdown from peak, and a running high-water curve.

**Two peaks are returned, and they can disagree.** `peak_mc_usd_recorded` is the stored high-water mark every other Robinhood Chain surface keys off (deployer runner-rate, the $40K graduation bar). `peak_mc_usd_observed` is the maximum of the 1-minute candle highs — trade-level truth, and always ≥ the recorded value. The recorded figure is sampled from write batches so it can undercount an intra-batch spike; both are surfaced rather than silently swapping one for the other, which would desync this endpoint from deployer tiering.

Candle history begins 2026-07-15, so a token that peaked earlier cannot have its peak reconstructed — `observed_covers_full_history` tells you whether the observed figure spans the token's whole life. Curve binning is chosen server-side (1m→4h) to keep the series bounded.

## Path parameters

- `address` string, required

## Query parameters

- `window` '24h' | '7d' | '30d' | 'all'
- `curve` 'true' | 'false'

## Response `200`

OK.

- object
  - `chain` 'robinhood'
  - `token_address` string
  - `name` string, nullable
  - `symbol` string, nullable
  - `current` object: Live market cap, liquidity, price, FDV.
  - `peak` object
    - `peak_mc_usd_recorded` number, nullable
    - `peak_mc_at_recorded` string, date-time, nullable
    - `peak_mc_usd_observed` number, nullable: Candle-derived max; ≥ recorded.
    - `peak_mc_at_observed` string, date-time, nullable
    - `observed_covers_full_history` boolean: False when candle history starts after the token did.
    - `pct_of_peak` number, nullable: Current MC ÷ best-known peak, [0,1].
    - `drawdown_from_peak` number, nullable: 1 − pct_of_peak.
  - `curve` object
    - `window` string
    - `bucket` string: Server-chosen bin size (1m/5m/15m/1h/4h).
    - `points` object[]
      - `bucket_start` string, date-time
      - `high_mc_usd` number, nullable
      - `close_mc_usd` number, nullable
      - `running_peak_mc` number, nullable: Monotonically non-decreasing high-water mark.
    - `count` integer

## Other responses

- `400`: Invalid EVM token address, or bad window.
- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: PRO tier required.
- `404`: Token not found on Robinhood Chain.
- `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-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-api/revisions/d9531a28d83b?raw)
