---
title: "Mobile Markets Snapshot V1"
method: GET
path: "/v1/mobile/markets/snapshot"
---

# Mobile Markets Snapshot V1

`GET /v1/mobile/markets/snapshot`

## Request

- Base URL: `https://api.n0brains.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.n0brains.com/v1/mobile/markets/snapshot`
- Auth: none declared

Typed mobile market snapshot (anonymous), in backend-owned directory
order. Reads the SHARED off-loop mids cache once — never the synchronous HL
SDK on the event loop, never one upstream call per asset, and never the
legacy /prices handlers, which are untyped and fail runtime verification.

Crypto rows price from that one mids payload. A curated non-crypto row is
not in it at all; its price is the TradFi reference quote, read READ-ONLY
from the cache the background primer warms, so a directory walk costs zero
upstream calls and an unwarmed symbol reports unavailable instead of being
fetched on the request path. The Hyperliquid perp mark and its oracle are
NOT that reference and are never substituted for it.

Machine values are decimal strings; priceText/changeText are authoritative
and localized here because TR and EN invert the decimal and grouping
separators. dataTime is the source's real observation time, not the request
time. Total mids failure returns 503 rather than an empty-but-successful
universe.

No verified 24h change source exists yet, so change fields stay null and
direction stays "unknown" — a fabricated change would be worse than none.

503 until MARKETS_SNAPSHOT_ENABLED. The check is first, so a closed
deployment reads no directory, no mids cache and no reference quote.

## Response `200`

Successful Response

- MobileSnapshotResponse: GET /v1/mobile/markets/snapshot — current prices for the directory universe, in backend-owned directory order. 503 on total source failure: an empty successful universe would read as 'no markets exist'.
  - `schemaVersion` 1, required
  - `items` MobileSnapshotItem[], required
    - `assetId` string, required: Opaque, case-sensitive; echoed untouched.
    - `price` string, nullable: Decimal string. null when genuinely unavailable — never a zero or placeholder stand-in.
    - `quoteAsset` string, nullable: Only when the source states it; never assumed USD.
    - `changeAbs` string, nullable: Decimal string.
    - `changePct` string, nullable: Decimal string.
    - `direction` 'up' | 'down' | 'flat' | 'unknown', required: Backend-derived. 'unknown' whenever change data is absent — it is never silently rendered as 'flat'.
    - `priceText` string, nullable: Authoritative localized display text. Never parsed back as a machine value.
    - `changeText` string, nullable: Authoritative localized display text.
    - `dataTime` string, nullable: Authoritative source/cache observation time, not the request time.
    - `state` 'ok' | 'stale' | 'degraded' | 'unavailable', required: Backend-owned freshness. The client invents no threshold.
  - `meta` MobileSnapshotMeta, required
    - `serverTime` string, required: Response-generation time, independent of any item dataTime.
    - `count` integer, required
    - `contentLanguage` 'en' | 'tr', required
    - `degraded` boolean, nullable: Present (true) ONLY when the UNIVERSE these rows were drawn from is the last known good directory rather than a fresh read. It describes the row SET, not the prices — per-item state/dataTime carry price freshness and are independent of this.
    - `dataTime` string, nullable: Observation time of a degraded universe. Present only alongside degraded.

## Other responses

- `503`: Service Unavailable

---

[API](https://skmtc.dev/n0brains/apis/n0brains-signals-api.md) · [All operations](https://skmtc.dev/n0brains/apis/n0brains-signals-api/llms.txt) · [OpenAPI document](https://skmtc.dev/n0brains/apis/n0brains-signals-api/revisions/ac21b5aebd10?raw)
