MM Flow

mmflow Open API · v1

Every market, one schema

Hyperliquid · Binance · OKX · Bybit · Aster · Lighter · Deribit · Coinbase + 20 more venues — unified into a single read-only public API. Keys optional. Anonymous: ~60 req/min per IP (edge-cache shared). With a free key: 300 req/min/key once enforcement turns on (see /profile/api-keys).

Base URL

https://mmflow.ai/api/v1

OpenAPI spec

/api/v1/openapi

TypeScript SDK

/docs/api/sdk

MCP server

/docs/api/mcp
GET/api/v1/perps/oi

Cross-venue open interest snapshot

Query params

coins(string)Comma-separated coin tickers (e.g. BTC,ETH,SOL). Omit for full universe.
venues(string)Comma-separated venue codes from {hl, bybit, okx, binance, bitmex, deribit, gateio}. Default: hl. Multi-venue adds ~500ms latency. Deriv venues (bitmex/deribit/gateio) report USD OI only (oiContracts=0) and default to BTC,ETH when no coins are given.

Try it

curl https://mmflow.ai/api/v1/perps/oi?coins=BTC,ETH&venues=hl,bybit,okx,binance,bitmex,deribit,gateio

Example response

{
  "data": [
    { "coin": "BTC", "venue": "binance",     "oiUsd": 9821030410.2, "oiContracts": 152801.4, "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "bybit",       "oiUsd": 4291832104.8, "oiContracts": 66801.2,  "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "hyperliquid", "oiUsd": 1294823041.2, "oiContracts": 19582.3,  "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "okx",         "oiUsd": 3812401084.5, "oiContracts": 59281.0,  "fetchedAt": 1730000000000 }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "hyperliquid:metaAndAssetCtxs+bybit:tickers+okx:open-interest+binance:openInterest" }
}
GET/api/v1/perps/funding

Cross-venue funding rates

Query params

coins(string)Comma-separated coin tickers.
venues(string)Comma-separated venue codes from {hl, binance, bybit, bitmex, deribit, gateio}. Default: hl. Each row carries periodHours (HL=1h; Binance/Bybit/BitMEX/Deribit/Gate.io=8h).

Try it

curl https://mmflow.ai/api/v1/perps/funding?coins=BTC&venues=hl,binance,bybit,bitmex,deribit,gateio

Example response

{
  "data": [
    { "coin": "BTC", "venue": "binance",     "rate": 0.0000832, "periodHours": 8, "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "bybit",       "rate": 0.0000721, "periodHours": 8, "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "hyperliquid", "rate": 0.0000125, "periodHours": 1, "fetchedAt": 1730000000000 }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "hyperliquid:metaAndAssetCtxs+binance:premiumIndex+bybit:tickers" }
}
GET/api/v1/perps/oi/history

HL OI historical time series

Query params

coin(string, required)Coin ticker (e.g. BTC).
sinceMs(number)Only return points with t >= sinceMs. Default: full retention.

Try it

curl https://mmflow.ai/api/v1/perps/oi/history?coin=BTC

Example response

{
  "data": {
    "coin": "BTC",
    "venue": "hyperliquid",
    "points": [
      { "t": 1747000000000, "v": 19582.3 },
      { "t": 1747000600000, "v": 19601.1 },
      { "t": 1747001200000, "v": 19594.8 }
    ],
    "cadenceMs": 600000,
    "retention": "~7d rolling",
    "enabled": true,
    "fetchedAt": 1747001800000
  },
  "meta": { "fetchedAt": 1747001800000, "source": "mmflow:kv-archive:oi-hl-snapshots" }
}
GET/api/v1/perps/funding/history

Cross-venue funding rate history per coin

Query params

coin(string, required)Coin ticker.
sinceMs(number)Only return points with ts >= sinceMs. Default: full retention.

Try it

curl https://mmflow.ai/api/v1/perps/funding/history?coin=BTC

Example response

{
  "data": {
    "coin": "BTC",
    "points": [
      { "ts": 1747000000000, "byVenue": { "hl": 0.0000125, "binance": 0.0000832, "bybit": 0.0000721 } },
      { "ts": 1747000600000, "byVenue": { "hl": 0.0000118, "binance": 0.0000801, "bybit": 0.0000698 } }
    ],
    "cadenceMs": 600000,
    "retention": "~7d rolling",
    "enabled": true,
    "fetchedAt": 1747001800000
  },
  "meta": { "fetchedAt": 1747001800000, "source": "mmflow:kv-archive:funding-cross-venue" }
}
GET/api/v1/options/chain

Deribit option chain (BTC / ETH / SOL / XRP)

Query params

underlying(BTC|ETH|SOL|XRP, required)Required. Underlying currency.

Try it

curl https://mmflow.ai/api/v1/options/chain?underlying=BTC

Example response

{
  "data": [
    {
      "instrument": "BTC-27DEC26-65000-C",
      "underlying": "BTC",
      "strike": 65000,
      "expiryMs": 1798502400000,
      "type": "C",
      "oi": 218.4,
      "volume24h": 4.2,
      "markIv": 47.83,
      "markPrice": 0.0451,
      "underlyingPrice": 64320.5
    }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "deribit:get_book_summary_by_currency" }
}
GET/api/v1/options/gex

Dealer Gamma Exposure surface

Query params

underlying(BTC|ETH|SOL|XRP, required)Required. Underlying currency.

Try it

curl https://mmflow.ai/api/v1/options/gex?underlying=BTC

Example response

{
  "data": {
    "underlying": "BTC",
    "spot": 64320.5,
    "totalGex": 412384210.5,
    "callWall": { "strike": 70000, "gex": 184382100.2 },
    "putWall": { "strike": 60000, "gex": -94284100.0 },
    "gammaFlip": 62800.0,
    "strikes": [
      { "strike": 60000, "callOi": 45.2, "putOi": 124.5, "gex": -94284100.0 },
      { "strike": 70000, "callOi": 218.4, "putOi": 12.3, "gex": 184382100.2 }
    ],
    "fetchedAt": 1730000000000
  },
  "meta": { "fetchedAt": 1730000000000, "source": "deribit:get_book_summary_by_currency" }
}
GET/api/v1/options/skew

IV smile per expiry + ATM term structure

Query params

underlying(BTC|ETH|SOL|XRP, required)Required. Underlying currency.

Try it

curl https://mmflow.ai/api/v1/options/skew?underlying=BTC

Example response

{
  "data": {
    "underlying": "BTC",
    "smileByExpiry": {
      "27DEC26": [
        { "strike": 60000, "iv": 0.58, "type": "P", "moneyness": 0.93 },
        { "strike": 65000, "iv": 0.48, "type": "C", "moneyness": 1.01 }
      ]
    },
    "termStructure": [
      { "expiryMs": 1798502400000, "expiryLabel": "27DEC26", "dteDays": 42, "atmIv": 0.49 }
    ],
    "fetchedAt": 1730000000000
  },
  "meta": { "fetchedAt": 1730000000000, "source": "deribit:get_book_summary_by_currency" }
}
GET/api/v1/perps/positioning

Net long/short positioning across Binance + OKX

Query params

coins(string)Comma-separated coin tickers.
period(15m|1h|4h)Sampling period (default 1h).

Try it

curl https://mmflow.ai/api/v1/perps/positioning?coins=BTC,ETH&period=1h

Example response

{
  "data": [
    { "coin": "BTC", "venue": "binance", "view": "global", "longFraction": 0.58, "longShortRatio": 1.38, "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "binance", "view": "top", "longFraction": 0.51, "longShortRatio": 1.04, "fetchedAt": 1730000000000 },
    { "coin": "BTC", "venue": "okx", "view": "top", "longFraction": 0.46, "longShortRatio": 0.85, "fetchedAt": 1730000000000 }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "binance+okx:longShortRatio" }
}
GET/api/v1/perps/whales

HL whale tape — recent prints over a notional threshold

Query params

minUsd(number)Min notional USD (default 100000).
coin(string)Filter to a single coin.
sinceMs(number)Only prints with ts >= sinceMs.
limit(number)Max prints (default 200, max 1000).

Try it

curl https://mmflow.ai/api/v1/perps/whales?minUsd=250000&limit=10

Example response

{
  "data": [
    { "coin": "BTC", "side": "buy", "notionalUsd": 1281042.5, "price": 64320.2, "ts": 1730000000000, "venue": "hyperliquid" },
    { "coin": "HYPE", "side": "sell", "notionalUsd": 420180.0, "price": 28.41, "ts": 1729999895000, "venue": "hyperliquid" }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "hyperliquid:whale-tape" }
}
GET/api/v1/perps/liquidations

24h cross-venue liquidation totals per coin

Query params

coins(string)Comma-separated coin filter.

Try it

curl https://mmflow.ai/api/v1/perps/liquidations?coins=BTC,ETH

Example response

{
  "data": [
    { "coin": "BTC", "long24hUsd": 18402100, "short24hUsd": 9281400, "max24hUsd": 4250000, "venues": ["okx"], "fetchedAt": 1730000000000 }
  ],
  "meta": { "fetchedAt": 1730000000000, "source": "okx:public/liquidation-orders" }
}
GET/api/v1/onchain/etf-flows

Spot ETF daily net flows (BTC / ETH)

Query params

asset(bitcoin|ethereum)Default bitcoin.

Try it

curl https://mmflow.ai/api/v1/onchain/etf-flows?asset=bitcoin

Example response

{
  "data": {
    "asset": "bitcoin",
    "tickers": ["IBIT","FBTC","BITB","ARKB","BTCO","EZBC","BRRR","HODL","BTCW","GBTC","BTC"],
    "rows": [
      { "dateLabel": "16 May 2026", "dateMs": 1747353600000, "values": { "IBIT": 281.4, "FBTC": 142.8 }, "total": 562.4 }
    ],
    "latestTotalUsdm": 562.4,
    "cumulativeUsdm": 38421.5,
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "farside:etf-flow-all-data" }
}
GET/api/v1/onchain/treasuries

Public-company crypto treasury holdings

Query params

asset(bitcoin|ethereum)Default bitcoin.

Try it

curl https://mmflow.ai/api/v1/onchain/treasuries?asset=bitcoin

Example response

{
  "data": {
    "asset": "bitcoin",
    "totalHoldings": 1543210,
    "totalValueUsd": 99284105100,
    "marketCapDominance": 7.81,
    "companies": [
      { "name": "MicroStrategy", "symbol": "MSTR.US", "country": "US", "totalHoldings": 244800, "totalEntryValueUsd": 9450000000, "totalCurrentValueUsd": 15750000000, "percentageOfTotalSupply": 1.166 }
    ],
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "coingecko:public_treasury" }
}
GET/api/v1/onchain/valuation

BTC on-chain valuation metrics (MVRV-Z, NUPL, Puell, Reserve Risk, Realized Cap)

Try it

curl https://mmflow.ai/api/v1/onchain/valuation

Example response

{
  "data": {
    "asset": "bitcoin",
    "mvrvZScore": 2.41,
    "nupl": 0.58,
    "puellMultiple": 1.28,
    "reserveRisk": 0.0042,
    "realizedCap": 581200000000,
    "asOfDate": "2026-05-17",
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "bitcoin-data.com" }
}
GET/api/v1/markets/spot

Cross-venue spot ticker (Coinbase + Binance + Bitfinex + Kraken + Gate.io)

Query params

coins(string)Comma-separated coin tickers (default BTC,ETH,SOL, max 20).

Try it

curl https://mmflow.ai/api/v1/markets/spot?coins=BTC,ETH

Example response

{
  "data": [
    { "coin": "BTC", "venue": "binance",  "price": 64310.5, "bid": 64310.4, "ask": 64310.6, "volume24h": 28412.1, "change24hPct": 1.42, "fetchedAt": 1747400000000 },
    { "coin": "BTC", "venue": "bitfinex", "price": 64312.0, "bid": 64311.0, "ask": 64313.5, "volume24h": 412.2,   "change24hPct": 1.39, "fetchedAt": 1747400000000 },
    { "coin": "BTC", "venue": "coinbase", "price": 64315.2, "bid": 64314.9, "ask": 64315.5, "volume24h": 1842.3,  "change24hPct": 1.41, "fetchedAt": 1747400000000 },
    { "coin": "BTC", "venue": "gateio",   "price": 64311.7, "bid": 64311.2, "ask": 64312.1, "volume24h": 921.4,   "change24hPct": 1.40, "fetchedAt": 1747400000000 },
    { "coin": "BTC", "venue": "kraken",   "price": 64309.8, "bid": 64309.0, "ask": 64310.6, "volume24h": 384.5,   "change24hPct": 1.38, "fetchedAt": 1747400000000 }
  ],
  "meta": { "fetchedAt": 1747400000000, "source": "coinbase+binance+bitfinex+kraken+gateio" }
}
GET/api/v1/flows/venue-spreads

Venue price pressure versus global median

Query params

coins(string)Comma-separated coin tickers (default BTC,ETH,SOL).

Try it

curl https://mmflow.ai/api/v1/flows/venue-spreads?coins=BTC,ETH

Example response

{
  "data": [
    {
      "coin": "BTC",
      "globalMedianUsd": 64311.7,
      "rows": [
        { "venue": "coinbase", "priceUsd": 64315.2, "basisBps": 0.54, "bid": 64314.9, "ask": 64315.5, "volume24h": 1842.3, "change24hPct": 1.41, "stale": false, "fetchedAt": 1747400000000 }
      ],
      "strongestPremiumVenue": "coinbase",
      "strongestDiscountVenue": "kraken",
      "fetchedAt": 1747400000000
    }
  ],
  "meta": { "fetchedAt": 1747400000000, "source": "flows:venue-spreads:coinbase+binance+bitfinex+kraken+gateio", "partial": false, "sources": [] }
}
GET/api/v1/flows/kimchi

Korean retail premium from Upbit KRW markets

Query params

coin(string)Coin ticker (default BTC).

Try it

curl https://mmflow.ai/api/v1/flows/kimchi?coin=BTC

Example response

{
  "data": {
    "coin": "BTC",
    "region": "KR",
    "localVenue": "upbit",
    "localPair": "KRW-BTC",
    "localPriceKrw": 104970000,
    "usdKrw": 1507.06,
    "localPriceUsd": 69651.3,
    "globalMedianUsd": 68420.4,
    "premiumPct": 1.8,
    "premiumBps": 180.0,
    "bidAskPressure": null,
    "interpretation": "premium",
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "flows:kimchi:upbit+frankfurter", "partial": false, "sources": [] }
}
GET/api/v1/flows/etf

ETF daily flow plus Coinbase proxy

Query params

asset(bitcoin|ethereum)Default bitcoin.

Try it

curl https://mmflow.ai/api/v1/flows/etf?asset=bitcoin

Example response

{
  "data": {
    "asset": "bitcoin",
    "daily": { "latestTotalUsdm": 412.0, "cumulativeUsdm": 38421.5, "latestDateMs": 1747353600000, "source": "farside" },
    "coinbaseProxy": {
      "coinbasePremiumBps": 8.4,
      "coinbaseVolumeShare": 0.18,
      "coinbaseTapeDeltaUsd5m": 840000,
      "coinbaseNetTradeUsd5m": 840000,
      "confidence": "medium",
      "label": "Coinbase proxy-only venue pressure read; not ETF attribution"
    },
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "flows:etf-proxy:farside+coinbase", "partial": false, "sources": [] }
}
GET/api/v1/flows/signals

Trader-readable flow signals

Query params

coins(string)Comma-separated coin tickers.

Try it

curl https://mmflow.ai/api/v1/flows/signals?coins=BTC,ETH

Example response

{
  "data": [
    {
      "id": "BTC:spot-led-demand:1747400000000",
      "coin": "BTC",
      "layer": "composite",
      "severity": "hot",
      "title": "Spot-led demand with Korea confirmation",
      "message": "Coinbase premium, Korea premium, and HL micro flow are all positive.",
      "confidence": "high",
      "ts": 1747400000000
    }
  ],
  "meta": { "fetchedAt": 1747400000000, "source": "flows:signals", "partial": false, "sources": [] }
}
GET/api/v1/flows/summary

Flow Pulse dashboard summary

Query params

coins(string)Comma-separated coin tickers (default BTC,ETH,SOL).

Try it

curl https://mmflow.ai/api/v1/flows/summary

Example response

{
  "data": {
    "coins": ["BTC", "ETH", "SOL"],
    "rows": [
      { "coin": "BTC", "coverage": { "globalSpot": "full", "kimchi": "live", "etfProxy": "live", "hlMicro": "live" }, "flowPressureScore": 68, "headline": "Coinbase +8.4 bps · Kimchi +2.10% · ETF +$412M · HL +$38.0M · positive flow pressure" }
    ],
    "signals": [],
    "fetchedAt": 1747400000000
  },
  "meta": { "fetchedAt": 1747400000000, "source": "flows:summary", "partial": false, "sources": [] }
}
GET/api/v1/flows/history

Redis-backed Flow history series

Query params

coin(string, required)Coin ticker.
metric(flowPressureScore|coinbasePremiumBps|kimchiPremiumBps|etfLatestTotalUsdm|coinbaseTapeDeltaUsd5m|hlMicroNetUsd5m|venueSpreadDispersionBps|sourcePartial, required)Canonical Flow history metric.
interval(1m)Default 1m.
sinceMs(number)Only return points with t >= sinceMs.

Try it

curl https://mmflow.ai/api/v1/flows/history?coin=BTC&metric=flowPressureScore&interval=1m

Example response

{
  "data": {
    "coin": "BTC",
    "metric": "flowPressureScore",
    "interval": "1m",
    "points": [
      {
        "t": 1747400000000,
        "v": 68,
        "partial": false,
        "stale": false,
        "source": "flows:summary",
        "sources": [],
        "coverage": { "globalSpot": "full", "kimchi": "live", "etfProxy": "live", "hlMicro": "live" }
      }
    ],
    "retention": "7d rolling",
    "enabled": true,
    "fetchedAt": 1747400060000
  },
  "meta": { "fetchedAt": 1747400060000, "source": "flows:history", "partial": false, "sources": [] }
}
GET/api/v1/markets

Venue catalog + per-venue market discovery

Query params

exchange(string)Venue id or alias (e.g. polymarket, hyperliquid, gateio, BINANCE_FUTURES). Omit for the full venue catalog.
pageSize(number)Markets per page (default 50, max 500).
page(number)Zero-based page index.

Try it

curl https://mmflow.ai/api/v1/markets?exchange=polymarket&pageSize=20

Example response

{
  "data": {
    "venues": [
      { "id": "binance", "name": "Binance", "kind": "cex", "status": "live", "capabilities": { "oi": true, "funding": true, "spot": true, "liquidations": true, "options": false, "predictions": false }, "dataSource": "Binance Futures public REST + forceOrder WebSocket" },
      { "id": "cme", "name": "CME", "kind": "tradfi", "status": "planned", "capabilities": { "oi": false, "funding": false, "spot": false, "liquidations": false, "options": false, "predictions": false }, "dataSource": "CME Market Data Platform (licensed) — integration planned" }
    ],
    "exchange": "polymarket",
    "markets": [
      { "exchange": "polymarket", "symbol": "0xabc…", "coin": null, "kind": "prediction", "label": "Will BTC close above $100k in 2025?" }
    ],
    "page": 0, "pageSize": 20, "total": 1
  },
  "meta": { "fetchedAt": 1747400000000, "source": "polymarket:markets" }
}
GET/api/v1/points

Generic cross-venue aggregation (type × exchanges × groupBy)

Query params

type(string, required)OI_AGG | FUNDING_AGG | SPOT (live). Advanced types (TRADE_SIDE_AGNOSTIC_AGG, TPO_AGG, BLOCK_BOOK_SNAPSHOT_AGG) return 501 (roadmap).
exchange(string, required)Repeatable. Venue id or alias (e.g. binance, BINANCE_FUTURES, OKEX_SWAP).
coin(string)Repeatable; or use coins=BTC,ETH.
transform.groupBy.type(string)GROUP_BY_TYPE_SUM folds across exchanges per coin (USD-normalized for OI). Default GROUP_BY_TYPE_NONE.

Try it

curl https://mmflow.ai/api/v1/points?type=OI_AGG&exchange=binance&exchange=bybit&coin=BTC&transform.groupBy.type=GROUP_BY_TYPE_SUM

Example response

{
  "data": {
    "type": "OI_AGG",
    "exchanges": ["binance", "bybit"],
    "groupBy": "GROUP_BY_TYPE_SUM",
    "rows": [
      { "type": "OI_AGG", "coin": "BTC", "exchange": "AGG", "value": 14112862515.0, "unit": "USD", "byExchange": { "binance": 9821030410.2, "bybit": 4291832104.8 }, "fetchedAt": 1747400000000 }
    ]
  },
  "meta": { "fetchedAt": 1747400000000, "source": "points:oi_agg" }
}
GET/api/v1/streams/whales

Live whale tape stream (Server-Sent Events, text/event-stream)

Query params

minUsd(number)Min notional USD (default 100000).
coin(string)Filter to a single coin.

Try it

curl https://mmflow.ai/api/v1/streams/whales?minUsd=250000

Example response

event: whale
id: 1747400000123
data: { "coin": "BTC", "side": "buy", "notionalUsd": 1281042.5, "price": 64320.2, "ts": 1747400000123, "venue": "hyperliquid" }

event: heartbeat
data: { "ts": 1747400015000 }

event: bye
data: { "reason": "max-duration" }
GET/api/v1/streams/trades

Live HL print stream for one coin (SSE)

Query params

coin(string, required)HL universe ticker (e.g. BTC).
minUsd(number)Min notional USD filter (default 0).

Try it

curl https://mmflow.ai/api/v1/streams/trades?coin=BTC&minUsd=50000

Example response

event: trade
id: 1747400000123
data: { "coin": "BTC", "side": "buy", "price": 64320.2, "size": 1.85, "notionalUsd": 118992.4, "ts": 1747400000123, "venue": "hyperliquid" }

event: heartbeat
data: { "ts": 1747400015000 }
GET/api/v1/streams/funding

Live HL funding-rate changes (SSE)

Query params

coins(string)Comma-separated tickers (default: full HL universe).
minDeltaBps(number)Min |delta| in bps to emit (default 0.5).

Try it

curl https://mmflow.ai/api/v1/streams/funding?coins=BTC,ETH&minDeltaBps=1

Example response

event: funding
id: 1747400000123
data: { "coin": "BTC", "rate": 0.0000182, "periodHours": 1, "prevRate": 0.0000125, "delta": 0.0000057, "ts": 1747400000123, "venue": "hyperliquid" }

event: heartbeat
data: { "ts": 1747400030000 }

Roadmap

Next endpoint landing in a subsequent PR: API-key issuance + per-key quota (currently the public surface is open with edge-cache rate-limiting only).

All responses follow the envelope { data, meta: { fetchedAt, source } }. Errors return { error, data: [], meta } with a 5xx status. CORS is open. Cache headers are set per endpoint (30s–60s typically). For real-time feeds use the SSE streams under /api/v1/streams/* with the browser EventSource API.