---
title: "Top 24h crypto gainers (universe scan)"
method: GET
path: "/api/coins/top-gainers"
tags: ["public-crypto-data"]
---

# Top 24h crypto gainers (universe scan)

`GET /api/coins/top-gainers`

## Request

- Base URL: `https://api.coinrithm.com`
- URL: `https://api.coinrithm.com/api/coins/top-gainers`
- Auth: none required

Keyless scan of CoinRithm's tracked coin universe for the largest 24h
price INCREASES, ordered by 24h change percent descending. Backs the
`get_crypto_movers` MCP tool and the agent runner's `universe_scan`
capability: it is how an agent finds candidates OUTSIDE its configured
watchlist.

The response is a BARE ARRAY, not an envelope. Each row's `ucid` is the
`coinId` every other endpoint takes (`/api/agent/market/{coinId}`,
`/api/agent/market/{coinId}/candles`, the futures quote/open body) —
pass it through directly. Do NOT re-derive the coin from `symbol`:
symbols collide across listings, so a symbol lookup can return a
different coin than the one that moved.

`change24h` and `currentPrice` are serialized as decimal STRINGS
(numeric columns), not JSON numbers. Values refresh on the ~60s core
price tick.

## Query parameters

- `limit` integer

## Response `200`

Top gainers, ordered by 24h change descending

- PublicCryptoMover[]: Bare array — this endpoint has no envelope, no pagination block.
  - `ucid` string, required: CoinRithm coin id. This is the SAME identifier the agent endpoints call `coinId`; pass it straight through rather than resolving the symbol (symbols collide across listings).
  - `symbol` string, required
  - `name` string, required
  - `slug` string, required: Public site slug (https://www.coinrithm.com/en/cryptocurrencies/{slug}).
  - `change24h` string, required: 24h price change in PERCENT, as a decimal string. Negative on the losers feed.
  - `currentPrice` string, required: Latest USD price as a decimal string.
  - `priceUpdatedAt` string, date-time, nullable: When the live price was last written; null when unknown.
  - `priceAgeHours` number, nullable: Hours since the live price was last written, one decimal; null when unknown.
  - `priceStale` boolean: True when the last live write is older than `priceStaleAfterHours`. The price stays in the row; treat it as a last known price.
  - `priceStaleAfterHours` number: Staleness threshold in hours (currently 72).

## Other responses

- `400`: Invalid or missing parameters. On a route with a query allowlist, an undocumented query parameter returns `{"error": "unsupported_query_parameter", "message": "Unsupported query parameter: <key>. Supported: <keys>."}`.
- `500`: Server error

---

[API](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api.md) · [All operations](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/llms.txt) · [OpenAPI document](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/revisions/28fb59f285fe?raw)
