API Endpoints

Complete reference for all CLOBr API endpoints with request/response examples.

Quick Reference

MethodEndpointDescriptionTier
GET/score/:addressGet single token scorePremium
POST/scoreBatch query up to 50 tokensEnterprise
GET/top-scoresTop 50 tokens by CLOBr scorePremium
GET/market-depthMarket depth data for a tokenPremium
GET/dca-pressureTop tokens ranked by DCA pressurePremium
GET/dca-ordersDCA orders with flow projectionsPremium
GET/limit-ordersLimit orders with price range filtersPremium
GET/whale-activityWhale accumulation & holder-flow for a tokenPremium
POST/whale-activityBulk whale summary for up to 10 tokensPremium
GET/dlmm/:addressDLMM pools for a single tokenPremium
GET/dlmm-poolsHot DLMM Pools board for a time windowPremium
GET/lp-cheat-sheetTokens ranked by LP fee densityPremium
GET/replay/:addressDepth history: liquidity per market and price bin over timePremium

Premium: available on every paid API tier, Premium and Enterprise. Enterprise: Enterprise subscription only.

Chains

CLOBr covers more than one chain. Every object that describes a token carries a chain field, and every endpoint accepts an optional chain parameter (a query parameter on GET, a body field on POST /score and POST /whale-activity).

Nothing changes unless you ask for it. An existing integration that never sends chain keeps getting exactly the rows and fields it got before — list endpoints still default to Solana. The new chain fields are added alongside the existing ones; nothing was renamed, retyped or removed. See the API changelog for the full 1.1.0 entry.

Chain keys

KeyChainAddress format
solanaSolanaBase58 mint (32–44 chars)
robinhoodRobinhood Chain0x + 40 hex contract address
allEvery chain the endpoint covers— always accepted

How chain behaves

List endpoints — /top-scores, /dca-pressure, /dlmm-pools, /lp-cheat-sheet. There is no address to read the chain off, so an absent chain means solana. That is deliberate: quietly mixing other chains into a list you already consume would be a breaking change in disguise. Opt in with chain=all or a specific key.

Address-keyed endpoints — /score/:address, POST /score, /market-depth, /dca-orders, /limit-orders, /whale-activity, /dlmm/:address. The two address spaces cannot collide (base58 vs 0x), so the address itself decides the chain and chain is never required. When you do send it, it names which chain the address is on: a value that contradicts the address — an EVM chain on a base58 mint, or solana on a 0x address — fails with chain_mismatch instead of quietly answering about something else. Anything else is a pin, not an error.

One score per asset. A token that trades on more than one chain has a single CLOBr score, computed from depth merged across every chain it trades on. /score and /top-scores report that one number — the same one the CLOBr web app shows — whichever of the asset's addresses you ask about. Each token object's chain tells you which chain the address is on, not which chain the score came from.

/limit-orders is the one exception: there chain on a Solana mint is also a real filter over the asset's cross-chain legs (chain=all merges them, chain=robinhood returns only that leg's orders).

all is always a valid value. On an endpoint that covers one chain it simply means that chain.

Chain errors (400)

invalid_chain

The value is not a chain key we know, and is not all.

{
  "error": "Invalid chain",
  "message": "Unknown chain 'sol'. Supported: solana, robinhood (or 'all').",
  "error_code": "invalid_chain",
  "chain": "sol",
  "supported_chains": ["solana", "robinhood"]
}
chain_not_supported

A real chain that this endpoint does not cover — also what you get when you pass a 0x address to a Solana-only endpoint. supported_chains lists what the endpoint does cover.

{
  "error": "Chain not supported",
  "message": "/dca-orders covers: solana",
  "error_code": "chain_not_supported",
  "chain": "robinhood",
  "supported_chains": ["solana"]
}
chain_mismatch

An explicit chain that disagrees with the address you asked about. resolved_chain says which chain the address actually belongs to. On POST /score the body also carries mismatched_addresses with every offending address.

{
  "error": "Chain mismatch",
  "message": "Address 9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump is on solana, not robinhood.",
  "error_code": "chain_mismatch",
  "chain": "robinhood",
  "resolved_chain": "solana",
  "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump"
}

Chain support by endpoint

EndpointChainsAbsent chain means
GET /score/:addresssolana, robinhoodDerived from the address
POST /scoresolana, robinhoodDerived per address
GET /top-scoressolana, robinhoodsolana
GET /market-depthsolana, robinhoodDerived from the address
GET /limit-orderssolana, robinhoodThe address's own chain (a real filter here — see above)
GET /dca-pressuresolanasolana
GET /dca-orderssolanaDerived from the address
GET / POST /whale-activitysolanaDerived from the address
GET /dlmm/:addresssolanaDerived from the address
GET /dlmm-poolssolanasolana
GET /lp-cheat-sheetsolanasolana
GET /replay/:addresssolana, robinhoodDerived from the address

An endpoint listed as Solana-only still accepts chain=solana and chain=all; any other real chain returns chain_not_supported. Coverage grows over time — this table is the current state, and the supported_chains array in a 400 body is always authoritative.

GET /score/:address

Get CLOBr score and price data for a single token. Tokens not yet analyzed will have null values with a status message.

Both address shapes are accepted: a base58 Solana mint or a 0x contract address on Robinhood Chain. The chain comes from the address, and the response says which one answered in chain. A 0x address that is a bridged leg of an asset with a Solana leg is answered as that Solana mint, with chain: "solana".

Parameters

NameRequiredDescription
addressYesToken address as a path segment: a base58 Solana mint or a 0x EVM contract address
chainNosolana, robinhood, all, or a numeric chain id. Derived from the address, so it only pins which EVM chain a 0x address is read on — a value that contradicts the address returns 400 chain_mismatch

Example Request

curl -X GET "https://clobr.io/api/v1/score/9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
  "chain": "solana",
  "symbol": "FARTCOIN",
  "name": "Fartcoin",
  "clobr_score": 53.1,
  "score_msg": "Balanced: Similar levels of support and resistance",
  "clobr_last_run": "2025-09-15T10:30:00Z",
  "clobr_current_price": 0.69420,
  "status": "available"
}

This endpoint never returns 404. An address we have no row for comes back 200 with status: "pending", because logging the request queues the token for analysis. See the status table below.

POST /score Enterprise Only

Batch query CLOBr scores for up to 50 tokens at once. Returns sparse data - tokens not yet analyzed will have null values.

Base58 Solana mints and 0x Robinhood Chain contract addresses can be mixed freely in one batch — each address's chain comes from its shape. The optional chain body field names the chain of every address in the batch; any address that contradicts it fails the whole request with 400 chain_mismatch, whose mismatched_addresses lists the offenders.

Example Request

curl -X POST "https://clobr.io/api/v1/score" \
  -H "x-api-key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "addresses": [
      "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "0x4a3b1c2d5e6f7089a1b2c3d4e5f60718293a4b5c"
    ]
  }'

chain is optional in the body. Omit it and every address is answered on its own chain.

Response Format

{
  "count": 2,
  "tokens": [
    {
      "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "chain": "solana",
      "symbol": "FARTCOIN",
      "clobr_score": 53.1,
      "status": "available"
    },
    {
      "address": "0x4a3b1c2d5e6f7089a1b2c3d4e5f60718293a4b5c",
      "chain": "robinhood",
      "symbol": null,
      "clobr_score": null,
      "status": "pending"
    }
  ]
}

Status Values

StatusMeaning
availableToken analyzed, all data populated
pendingNew token, waiting for analysis (~15 seconds)
unsupportedOn Solana: token excluded from coverage (stablecoins, wrapped tokens) — terminal. On an EVM chain it means not indexed yet: there is no on-demand refresh queue there, so the answer can change as coverage grows, but don't poll for it.
unscoredDepth-only coverage: market-depth data and price are available, but this token is never scored. clobr_score stays null. Terminal — do not poll for a score.
price_unavailableToken supported but no price data from Jupiter

GET /top-scores

Returns the top 50 tokens ranked by CLOBr score. No parameters required: without chain the board is Solana only, exactly as before. Pass chain=robinhood for the Robinhood Chain board, or chain=all to merge every supported chain into one top 50 by score.

Parameters

NameRequiredDescription
chainNosolana (default), robinhood, or all

Example Request

curl -X GET "https://clobr.io/api/v1/top-scores?chain=all" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "chain": "all",
  "count": 50,
  "tokens": [
    {
      "address": "...",
      "chain": "solana",
      "symbol": "FARTCOIN",
      "clobr_score": 95.6,
      "clobr_current_price": 0.69420,
      "status": "available"
    },
    {
      "address": "0x4a3b1c2d5e6f7089a1b2c3d4e5f60718293a4b5c",
      "chain": "robinhood",
      "symbol": "HOOD",
      "clobr_score": 91.2,
      "clobr_current_price": 1.24,
      "status": "available"
    },
    ...
  ]
}

The top-level chain echoes the effective filter ("solana" when you sent nothing). Each token carries the chain it actually lives on.

GET /market-depth

Returns market depth data for a specific token.

Premium: Live data at 60 requests per rolling minute
Enterprise: Real-time data with custom rate limits

Parameters

NameRequiredDescription
token_addressYesToken address to query. Either shape: a base58 Solana mint or a 0x EVM contract address
chainNosolana, robinhood, or all. Derived from token_address, so it's only an assertion — a value that disagrees returns 400 chain_mismatch
exchange_typeNoDEX (default), CEX, or ALL
currencyNoUSD (default) or SOL
low_pct_changeNoLower bound % change (-0.9 to 10.0)
high_pct_changeNoUpper bound % change (-0.9 to 10.0)
delayedNotrue for delayed data
include_summaryNotrue to include aggregated support/resistance totals broken down by exchange_type and source, plus a total constant-product liquidity figure (default: false). Returned under a top-level summary object.

Example Request

curl -X GET "https://clobr.io/api/v1/market-depth?token_address=9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump&delayed=true&include_summary=true" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "query_parameters": {
    "token_address": "...",
    "exchange_type": "DEX",
    "currency": "USD",
    "delayed": true,
    "include_summary": true,
    "chain": "solana"
  },
  "chain": "solana",
  "last_refresh": 1747593235,
  "clobr_score": 53.1,
  "score_msg": "Balanced: Similar levels of support and resistance",
  "price": 0.00151,
  "depth_data": [
    {
      "price": 0.00164,
      "support": 0,
      "resistance": 5553.40,
      "constant_product": 945.11
    },
    ...
  ],
  "summary": {
    "by_exchange_type": [
      { "exchange_type": "DEX", "support": 38000.00, "resistance": 40000.00 }
    ],
    "by_source": [
      { "source": "Orca Whirlpool", "support": 20000.00, "resistance": 25000.00 },
      { "source": "Meteora DLMM", "support": 18000.00, "resistance": 15000.00 }
    ],
    "constant_product": 3186681.11
  }
}

chain is the chain the token address resolved to (solana for a base58 mint, robinhood for a 0x Robinhood Chain contract address). It is always present, at the top level and inside query_parameters.

The summary object is only returned when include_summary=true. Aggregations honor the same token_address, percentage range, exchange_type filter, and currency conversion as depth_data. by_exchange_type and by_source cover concentrated liquidity (CLMM/DLMM/limit orders); constant-product AMM liquidity is reported separately under constant_product.

GET /dca-pressure

Returns the top tokens ranked by aggregate DCA (Dollar Cost Average) pressure. Includes net buy/sell totals and impact projections across multiple timeframes (5min to 24hr). Optionally includes nested individual orders per token.

Rate limit: 6 requests per minute (data updates every ~15 seconds)

Parameters

NameRequiredDescription
chainNosolana (default) or all. DCA data is Solana-only, so all is equivalent to solana; any other chain returns 400 chain_not_supported
sort_byNousd (default) or impact (percentage)
sort_dirNodesc (default, buy pressure first) or asc (sell pressure first)
sort_timeframeNo5_min, 30_min, 1_hr, 6_hr, 24_hr (default)
include_ordersNotrue to include nested individual orders per token (default: false)
order_limitNoMax orders per token when include_orders=true (default 5, max 20)
limitNoNumber of tokens to return (default 20, max 50)
min_mcap / max_mcapNoMarket cap filter range (USD)
min_liquidity / max_liquidityNoSupport Liquidity filter range (USD): CLOBr's buy-support depth within ±25% of the current price (the in-range share of constant-product / 50-50 pool liquidity plus concentrated buy-side / paired-token liquidity in those price rungs), not total or sell-side liquidity

Example Request

curl -X GET "https://clobr.io/api/v1/dca-pressure?sort_by=impact&sort_timeframe=1_hr&limit=10" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "query_parameters": {
    "sort_by": "impact",
    "sort_timeframe": "1_hr",
    "include_orders": false,
    "limit": 10,
    "chain": "solana"
  },
  "count": 10,
  "tokens": [
    {
      "token": {
        "address": "98sMhvDwXj1RQi5c5Mndm3vPe9cBqPrbLaufMXFNMh5g",
        "chain": "solana",
        "symbol": "HYPE",
        "name": "HYPE",
        "icon": "https://...",
        "mcap": 5250000000,
        "liquidity_usd": 525000,
        "price_usd": 0.001
      },
      "buy_order_count": 5,
      "sell_order_count": 0,
      "total_buy_usd": 371518.97,
      "total_sell_usd": 0,
      "net_usd": 371518.97,
      "impact": {
        "net_usd_5_min": 100.50,
        "net_usd_30_min": 500.25,
        "net_usd_1_hr": 1200.00,
        "net_usd_6_hr": 8000.00,
        "net_usd_24_hr": 369369.07,
        "net_pct_5_min": 0.02,
        "net_pct_30_min": 0.08,
        "net_pct_1_hr": 0.15,
        "net_pct_6_hr": 0.90,
        "net_pct_24_hr": 0.07
      },
      "orders": []
    }
  ]
}

GET /dca-orders

Returns top DCA (Dollar Cost Average) orders for a token, sorted by percentage impact or USD flow. Includes active order details with time-based flow projections. Ideal for identifying large DCA buy/sell pressure to feed trading bots and terminals.

Parameters

NameRequiredDescription
token_addressYesToken mint address (base58). A 0x address returns 400 chain_not_supported — DCA data is Solana-only
chainNosolana or all. Derived from the address, so it's only an assertion — a value that disagrees returns 400 chain_mismatch
sort_byNopct_impact (default) or usd_flow
min_mcap / max_mcapNoMarket cap filter range (USD)
min_liquidity / max_liquidityNoSupport Liquidity filter range (USD): CLOBr's buy-support depth within ±25% of the current price (the in-range share of constant-product / 50-50 pool liquidity plus concentrated buy-side / paired-token liquidity in those price rungs), not total or sell-side liquidity
limitNoMax orders to return (default 20, max 50)

Example Request

curl -X GET "https://clobr.io/api/v1/dca-orders?token_address=9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump&sort_by=usd_flow&limit=10" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "query_parameters": {
    "token_address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
    "sort_by": "usd_flow",
    "limit": 10,
    "chain": "solana"
  },
  "token": {
    "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
    "chain": "solana",
    "symbol": "FARTCOIN",
    "name": "Fartcoin",
    "mcap": 850000000,
    "liquidity_usd": 12500000,
    "clobr_score": 53.1,
    "price_usd": 0.69420,
    "last_refresh": 1747593235
  },
  "count": 10,
  "orders": [
    {
      "dca_address": "...",
      "chain": "solana",
      "direction": "BUY",
      "symbol": "FARTCOIN",
      "paired_symbol": "SOL",
      "deposited_usd": 5000,
      "remaining_usd": 3200,
      "pct_filled": 0.36,
      "in_active_range": true,
      "cycle_frequency": 3600,
      "price_range": {
        "min_usd": 0.50,
        "max_usd": 1.00,
        "current_price_usd": 0.694
      },
      "flow_projections": {
        "usd_next_5_min": 12.50,
        "usd_next_30_min": 75.00,
        "usd_next_1_hr": 150.00,
        "usd_next_6_hr": 900.00,
        "usd_next_24_hr": 3200.00
      }
    }
  ]
}

GET /limit-orders

Returns active limit orders for a token within a specified percentage range of current price. Default range is -90% to +1000%. Includes orders from both Jupiter and Fusion platforms. Use the optional pct range parameters to narrow results.

This is the one endpoint where chain is a real filter rather than only an assertion. For a base58 Solana mint, leaving it off returns exactly the Solana orders it always did; chain=all merges in the orders on that asset's other chain legs, and chain=robinhood returns only that leg's orders. A 0x contract address is answered from that chain directly. The percentage range, the limit and the sort all apply to the merged list, and every order carries its own chain.

Parameters

NameRequiredDescription
token_addressYesToken address. Either shape: a base58 Solana mint or a 0x EVM contract address
chainNosolana, robinhood, or all. Absent means the address's own chain (Solana orders only for a base58 mint); all merges every leg of the asset
low_pct_changeNoLower bound % change (-0.99 to 10.0, default -0.9)
high_pct_changeNoUpper bound % change (-0.99 to 10.0, default 10.0)
limitNoMax orders to return (default 100, max 500)

Example Request

curl -X GET "https://clobr.io/api/v1/limit-orders?token_address=9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump&low_pct_change=-0.5&high_pct_change=2.0&chain=all" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "query_parameters": {
    "token_address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
    "low_pct_change": -0.5,
    "high_pct_change": 2.0,
    "limit": 100,
    "chain": "all"
  },
  "token": {
    "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
    "chain": "solana",
    "symbol": "FARTCOIN",
    "name": "Fartcoin",
    "mcap": 850000000,
    "liquidity_usd": 12500000,
    "clobr_score": 53.1,
    "price_usd": 0.69420,
    "last_refresh": 1747593235
  },
  "count": 42,
  "orders": [
    {
      "order_address": "...",
      "chain": "solana",
      "direction": "BUY",
      "platform": "jupiter",
      "symbol": "FARTCOIN",
      "paired_symbol": "SOL",
      "maker": "...",
      "usd_price": 0.55,
      "current_price_usd": 0.694,
      "pct_away": -0.21,
      "usd_support_amount": 2500.00,
      "usd_resistance_amount": 0,
      "pct_complete": 15.5,
      "created_at": 1747500000
    }
  ]
}

query_parameters.chain echoes the filter that was applied (all here). token.chain is the chain the queried address lives on, and each order's chain is the leg that order sits on — with chain=all a single response can mix them.

GET /whale-activity

Returns the Whale Accumulation panel data for a single Solana token by contract address. Includes accumulating wallets, brand-new wallets and net flow bucketed by holder tier (top 20 / 50 / 100) over 1D / 7D / 30D windows, a 30-day daily sparkline per tier, and (optionally) the top-holder table with per-wallet 1D/7D/14D/30D balance change and an optional 30-day activity trend.

Chain: Solana only
Rate limit: 1 request per second (cache responses ~60s, snapshot data refreshes roughly each minute)

Parameters

NameRequiredDescription
token_addressYesSolana token mint address (base58). A 0x address returns 400 chain_not_supported
chainNosolana or all. Derived from the address, so it's only an assertion — a value that disagrees returns 400 chain_mismatch
includeNoComma-separated sections: summary, sparkline, wallets (default: all three)
wallet_limitNoTop holders to return: 20, 50, or 100 (default 100)
wallet_activityNotrue to attach a 30-day daily activity trend per wallet (heavier payload, default false)

Example Request

curl -X GET "https://clobr.io/api/v1/whale-activity?token_address=9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump&include=summary,sparkline,wallets&wallet_limit=50" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "token_address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
  "chain": "solana",
  "has_coverage": true,
  "last_snapshot_at": "2025-09-15T10:30:00Z",
  "windows": ["1d", "7d", "30d"],
  "tiers": ["top20", "top50", "top100"],
  "summary": {
    "accumulating": {
      "top20":  { "1d": 4, "7d": 9,  "30d": 12 },
      "top50":  { "1d": 8, "7d": 21, "30d": 31 },
      "top100": { "1d": 13, "7d": 38, "30d": 57 }
    },
    "new_wallets": {
      "top20":  { "1d": 1, "7d": 2, "30d": 3 },
      "top50":  { "1d": 2, "7d": 5, "30d": 9 },
      "top100": { "1d": 3, "7d": 8, "30d": 15 }
    },
    "net_flow": {
      "top20":  { "1d": { "net": 1250000, "inflow": 1400000, "outflow": -150000 }, "7d": { "...": "..." }, "30d": { "...": "..." } },
      "top50":  { "...": "..." },
      "top100": { "...": "..." }
    }
  },
  "sparkline": {
    "top20": [
      { "day": "2025-08-17", "accumulating": 2, "new_wallets": 0, "net": 320000, "inflow": 400000, "outflow": -80000 }
    ],
    "top50": [ "..." ],
    "top100": [ "..." ]
  },
  "wallets": [
    {
      "rank": 1,
      "owner": "5Q544fKr...",
      "balance": 12750000,
      "balance_change": {
        "1d":  { "tokens": 0,       "pct": 0 },
        "7d":  { "tokens": 250000,  "pct": 2.0 },
        "14d": { "tokens": 750000,  "pct": 6.2 },
        "30d": { "tokens": 12750000, "pct": null }
      }
    }
  ]
}

balance_change.pct is null for brand-new positions (no pre-window balance). When has_coverage is false the token has not been backfilled yet and summary/wallets are empty.

POST /whale-activity Bulk

Returns whale accumulation summary (and optional sparkline) for up to 10 Solana tokens in one request. Wallet tables are not available in bulk. Use the single-token GET for those. Tokens without coverage come back with has_coverage: false.

Max tokens: 10 per request
Rate limit: 6 requests per minute (quota cost = number of tokens requested)

Example Request

curl -X POST "https://clobr.io/api/v1/whale-activity" \
  -H "x-api-key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "token_addresses": [
      "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr"
    ],
    "include": ["summary", "sparkline"]
  }'

The body also accepts an optional chain field (solana or all). Each address's chain comes from its shape, so it is only an assertion.

Response Format

{
  "chain": "solana",
  "count": 2,
  "tokens": [
    {
      "token_address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "chain": "solana",
      "has_coverage": true,
      "last_snapshot_at": "2025-09-15T10:30:00Z",
      "summary": { "accumulating": { "...": "..." }, "new_wallets": { "...": "..." }, "net_flow": { "...": "..." } },
      "sparkline": { "top20": ["..."], "top50": ["..."], "top100": ["..."] }
    },
    {
      "token_address": "7GCihgDB8fe6KNjn2MYtkzZcRjQy3t9GHdC8uHYmW2hr",
      "chain": "solana",
      "has_coverage": false,
      "last_snapshot_at": null
    }
  ]
}

GET /dlmm/:address

Returns the DLMM pools for a single token: the pool list with 1-hour realized stats and leader chips. Mirrors the token page's DLMM Pools tab. A pool with no board activity this hour has stats_1h: null and no chips, and individual stats_1h fields can also be null. The per-pool chips array is the label mirror of the winning pool in chips.leaders.

Rate limit: 1 request per second (Premium)

Parameters

NameRequiredDescription
addressYesToken mint address (base58), passed as a path segment. A 0x address returns 400 chain_not_supported — DLMM pools are Solana-only
chainNosolana or all. Derived from the address, so it's only an assertion — a value that disagrees returns 400 chain_mismatch

Example Request

curl -X GET "https://clobr.io/api/v1/dlmm/9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
  "chain": "solana",
  "period": "1h",
  "pools": [
    {
      "pubkey": "Ah2sM6ZzR8YpXv1kQ3n7DfWcJL9uTbEo5RgNhKmSPqV",
      "bin_step": 100,
      "active_id": 8388608,
      "token_x_mint": "So11111111111111111111111111111111111111112",
      "token_x_symbol": "SOL",
      "token_x_icon": "https://...",
      "token_x_decimals": 9,
      "token_x_price": 172.4,
      "token_y_mint": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "token_y_symbol": "SOLdiers",
      "token_y_icon": "https://...",
      "token_y_decimals": 6,
      "token_y_price": 0.0000249,
      "pool_price": 0.0000249,
      "base_fee_pct": 1.0,
      "dynamic_fee_pct": 3.58,
      "reserve_x": 350.2,
      "reserve_x_usd": 60000,
      "reserve_y": 2100000000,
      "reserve_y_usd": 52900,
      "total_liquidity_usd": 112900,
      "num_positions": 0,
      "num_wallets": 0,
      "stats_1h": {
        "fees": 2000,
        "volume": 585100,
        "effectiveFeeBps": 34.2,
        "feesPerAvgTvl": 0.0163,
        "rangeYield": 0.125,
        "rangeTvl": 16000,
        "feeCapture": 1.4,
        "captureShare": 0.55,
        "tvl": 585100
      },
      "chips": []
    }
  ],
  "chips": {
    "definitions": [
      { "key": "feesPerAvgTvl", "label": "Top $/TVL", "tip": "..." },
      { "key": "rangeYield", "label": "Top range yield", "tip": "..." },
      { "key": "fees", "label": "Most fees", "tip": "..." }
    ],
    "leaders": {
      "feesPerAvgTvl": "Ah2sM6ZzR8YpXv1kQ3n7DfWcJL9uTbEo5RgNhKmSPqV",
      "rangeYield": "Ah2sM6ZzR8YpXv1kQ3n7DfWcJL9uTbEo5RgNhKmSPqV",
      "fees": "Ah2sM6ZzR8YpXv1kQ3n7DfWcJL9uTbEo5RgNhKmSPqV"
    }
  }
}

GET /dlmm-pools

Returns the Hot DLMM Pools board: live Meteora DLMM pools ranked for a single time window. Scope the board to one token's pools with the mint parameter, which also adds a rangeYield figure per pool.

Rate limit: 1 request per second (Premium)

Parameters

NameRequiredDescription
chainNosolana (default) or all. DLMM coverage is Solana-only, so all is equivalent to solana
periodNo1h (default), 2h, 4h, 12h, or 24h
sortNorangeyield (default), feespertvl, fees, volume, or tvl. rangeyield = fees / avg liquidity in the window's full traveled price range (set-and-forget); rangeCeiling in the response is the perfect-rebalancer upper bound; feespertvl = fees / warehouse-averaged pool TVL
minTvlNoUSD TVL floor (0 to 10,000,000, default 10000; 0 when a mint is set)
mintNoBase58 token mint that scopes the board to that token's pools (adds rangeYield)

Example Request

curl -X GET "https://clobr.io/api/v1/dlmm-pools?period=1h&sort=feespertvl&minTvl=10000" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "chain": "solana",
  "period": "1h",
  "sort": "feespertvl",
  "minTvl": 10000,
  "mint": null,
  "count": 50,
  "data": [
    {
      "address": "Ah2sM6ZzR8YpXv1kQ3n7DfWcJL9uTbEo5RgNhKmSPqV",
      "baseSymbol": "SOL",
      "quoteSymbol": "SOLdiers",
      "baseMint": "So11111111111111111111111111111111111111112",
      "quoteMint": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "tokenIcon": "https://...",
      "tvl": 585100,
      "binStep": 100,
      "baseFeePct": 1.0,
      "volume": 585100,
      "fees": 2000,
      "effectiveFeeBps": 34.2,
      "captureShare": 0.55,
      "feeCapture": 1.4,
      "tokenPoolCount": 5,
      "rangeTvl": 16000,
      "rangeYield": 0.125,
      "rangeCeiling": 0.31,
      "feesPerAvgTvl": 0.0163
    }
  ]
}

GET /lp-cheat-sheet

Returns the LP fee-density leaderboard: tokens ranked by fee density (organic volume ÷ near-price liquidity), the return-on-liquidity signal for LPs. Same metric as the /lp-cheat-sheet page.

Rate limit: 1 request per second (Premium)

Parameters

NameRequiredDescription
chainNosolana (default) or all. This leaderboard covers Solana only, so all is equivalent to solana
windowNoVolume window for the numerator: 1h (default), 6h, or 24h
denominatorNonear (default), bin10, or range. near = ±25-bin fixed band; bin10 = ±10-bin fixed band; range = liquidity inside the window's traveled price range
limitNoNumber of tokens to return (1 to 100, default 25)

Example Request

curl -X GET "https://clobr.io/api/v1/lp-cheat-sheet?window=1h&denominator=near&limit=25" \
  -H "x-api-key: your_api_key_here"

Response Format

{
  "chain": "solana",
  "window": "1h",
  "denominator": "near",
  "limit": 25,
  "count": 25,
  "data": [
    {
      "rank": 1,
      "address": "9BB6NFEcjBCtnNLFko2FqVQBq8HHM13kCyYcdQbgpump",
      "chain": "solana",
      "symbol": "SOLdiers",
      "name": "SOLdiers",
      "icon": "https://...",
      "organic_volume": 585100,
      "denom_liquidity_usd": 112900,
      "fee_density": 5.18
    }
  ]
}

Tokens with under $1,000 of near-price liquidity are excluded (denominator floor).

GET /replay/:address

Returns a token's depth history: the support and resistance liquidity in every market, per price bin, snapshot by snapshot. It is the data behind the Replay tab, at the resolution it is stored. Works for a Solana mint or a 0x contract. The address decides the chain, so this endpoint takes no chain parameter.

Rate limit: 1 request per 10 seconds per API key across all tokens. Enterprise keys get 10 requests per second. If the server is busy it returns 429 with replay_busyand Retry-After: 1; retry, and no quota is used. Each request costs one call from your monthly quota.

Resolution and retention

  • Solana: every stored snapshot (raw, seconds to a couple of minutes apart, depending on the token) from 2026-10-03 18:00 UTC onward. Before that, one snapshot every 15 minutes (15m) back to late September 2026.
  • Robinhood Chain: every stored snapshot (raw, about 2 minutes apart) from 2026-10-01 onward. Before that, one snapshot per hour (1h, about -25% to +22% around the price) back to late September 2026, for actively tracked tokens.
  • How much history exists: 365 days is a rolling retention limit, not the amount available today. History grows by one day each day until it reaches 12 months (around October 2027); after that, the oldest day drops off each day. A window with no stored snapshots returns snapshot_count: 0 and window.served_from: null; a window ending more than 365 days ago returns 400 window_out_of_range.
  • Every snapshot says which tier it came from. Where raw data exists, raw data is served.

Parameters

NameRequiredDescription
fromNoWindow start. Unix epoch seconds (1791053458) or an RFC 3339 timestamp with a zone (2026-10-03T00:00:00Z). Default: 24 hours before to. Milliseconds and timestamps without a zone are rejected.
toNoWindow end, same formats. Default: now. The window is clamped to the last 365 days.
groupNoWhat one ladder stands for. market (default): each pool or order book. venue: every market of one venue summed, for example all Orca Whirlpool pools. type: one ladder per type (see types). all: one ladder per snapshot, everything summed (the smallest response).
typesNoKeep only these types, comma-separated: onchain_pool (DEX pools, including the constant-product total), onchain_limit_order (Jupiter, Meteora and Fusion limit orders), cex_spot, cex_perp (futures and perps books). Default: all.
onchainNotrue is short for types=onchain_pool,onchain_limit_order.
venuesNoKeep only these venues, comma-separated venue keys. A key is the venue name in lowercase with dashes: orca-whirlpool, meteora-dlmm, jupiter-limit-order, constant-product, binance, binance-futures, uniswap-v3-robinhood. Every response lists the token's keys in facets.venues. A key with no depth in the page comes back in filter.venues_not_found.
exclude_types, exclude_venuesNoKeep everything except these keys. The short way to drop one or two venues, for example exclude_venues=binance-futures,hyperliquid-perps. Send venues or exclude_venues (and types or exclude_types), not both.
marketsNoDeprecated, use group. split means group=market, aggregate means group=all. Sending both with different meanings returns 400 invalid_group.
min_pct, max_pctNoPrice band around each snapshot's price, in percent. Default -50 and 100; allowed -90 to 1000.

Paging

One response holds up to 100,000 cells (and at most 288 snapshots), and never part of a snapshot. If the window does not fit, next_from is the time of the first snapshot not served: request again with from=next_from and the same to. next_from is null on the last page. A busy token such as PUMP fits about 15 split snapshots per page, or a full hour of aggregate ones.

Response format

The response is columnar. Markets are listed once, and each snapshot carries parallel arrays: cell i is market_idx[i], bin[i], support_usd[i], resistance_usd[i]. A bin is a step on a 1% geometric ladder: its price is price_usd × 1.01^bin. Times are Unix epoch seconds. Send Accept-Encoding: gzip or br; a full page compresses about 5 to 10 times.

Grouping and filters

The filter runs first, then the grouping, so a grouped ladder never holds depth you filtered out. Each type and venue is classified from the market's source: CEX books are spot or perps (futures, perps and COIN-M books), on-chain order books are limit orders, and every other on-chain market is a pool. Constant-product depth is stored as one total per token, so its venue is constant-product. Every response except group=all without a filter carries facets: each type's and venue's mean depth per snapshot in the page, before the filter, with the keys to use. Grouping makes cells fewer, not snapshots: paging works as below. To leave out a venue or two, use the exclude form: group=venue&exclude_venues=binance-futures keeps every venue but Binance Futures.

Example: depth per venue, on-chain only

curl --compressed "https://clobr.io/api/v1/replay/pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn?from=1791139064&group=venue&onchain=true" \
  -H "x-api-key: your_api_key_here"
{
  "group": "venue",
  "filter": { "types": ["onchain_limit_order", "onchain_pool"], "venues": null,
              "exclude_types": null, "exclude_venues": null, "venues_not_found": [] },
  "snapshot_count": 10,
  "groups": [
    { "key": "byreal-clmm", "label": "ByReal CLMM", "type": "onchain_pool" },
    { "key": "raydium-clmm", "label": "Raydium CLMM", "type": "onchain_pool" },
    { "key": "meteora-dlmm", "label": "Meteora DLMM", "type": "onchain_pool" }
  ],
  "facets": {
    "frames": 10,
    "types": [
      { "key": "onchain_pool", "label": "On-chain pools", "usd": 18580647 },
      { "key": "onchain_limit_order", "label": "On-chain limit orders", "usd": 67386 },
      { "key": "cex_spot", "label": "CEX spot", "usd": 38051443 },
      { "key": "cex_perp", "label": "CEX perps", "usd": 69455478 }
    ],
    "venues": [
      { "key": "hyperliquid-perps", "label": "Hyperliquid Perps", "type": "cex_perp", "usd": 27817478 },
      { "key": "binance-futures", "label": "Binance Futures", "type": "cex_perp", "usd": 18940544 }
    ]
  },
  "snapshots": [
    {
      "t": 1791139077,
      "tier": "raw",
      "price_usd": 0.00657776510719,
      "group_idx": [0, 0, 0],
      "bin": [-69, -68, -67],
      "support_usd": [158.52, 159.31, 160.11],
      "resistance_usd": [0, 0, 0]
    }
  ]
}

Example: one venue, summed into one ladder

curl --compressed "https://clobr.io/api/v1/replay/pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn?from=1791139064&group=all&venues=orca-whirlpool" \
  -H "x-api-key: your_api_key_here"
{
  "group": "all",
  "filter": { "types": null, "venues": ["orca-whirlpool"],
              "exclude_types": null, "exclude_venues": null, "venues_not_found": [] },
  "snapshot_count": 10,
  "row_count": 1390,
  "markets": [],
  "snapshots": [
    {
      "t": 1791139077,
      "tier": "raw",
      "price_usd": 0.00657776510719,
      "bin": [-69, -68, -67],
      "support_usd": [3843.96, 3874.22, 3942.74],
      "resistance_usd": [0, 0, 0]
    }
  ]
}

Example Request

curl --compressed "https://clobr.io/api/v1/replay/pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn?from=2026-10-03T19:30:58Z&to=2026-10-03T20:30:58Z" \
  -H "x-api-key: your_api_key_here"

Example Response (trimmed)

{
  "token": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
  "chain": "solana",
  "window": {
    "from": 1791053458,
    "to": 1791057058,
    "clamped": false,
    "served_from": 1791053474,
    "served_to": 1791053848
  },
  "next_from": 1791053857,
  "group": "market",
  "filter": { "types": null, "venues": null, "exclude_types": null,
              "exclude_venues": null, "venues_not_found": [] },
  "markets_mode": "split",
  "min_pct": -50,
  "max_pct": 100,
  "bin_ratio": 1.01,
  "snapshot_count": 15,
  "row_count": 94619,
  "markets": [
    { "source": "Meteora DLMM", "exchange_type": "DEX",
      "address": "4C8KctYZtMTZwV83Y5AcTPVT2aXYYu2t9ZhHdotFGnno", "pair": "MET" },
    { "source": "Meteora DLMM", "exchange_type": "DEX",
      "address": "D7CCRNx6e2ck22P8N93xqJ2Kbcu13RmYVFYeVRqAyN8n", "pair": "SOL" }
  ],
  "snapshots": [
    {
      "t": 1791053474,
      "tier": "raw",
      "price_usd": 0.006302025402746,
      "market_idx": [1, 1, 1],
      "bin": [-1, 0, 1],
      "support_usd": [60.31, 0, 0],
      "resistance_usd": [0, 60.31, 120.62]
    }
  ]
}

A 0x address that is the Robinhood Chain leg of a token that also trades on Solana is answered from the Solana mint, named in resolved_token. Cells under $1 per market and bin are left out. With group=all, markets is empty and snapshots have no market_idx. With group=venue or type, cells index groups through group_idx instead.

API Endpoints | CLOBr Docs