Strak docs

Getting started

Strak documentation

Strak is a terminal for every tokenized stock on Solana. Next to price and volume it shows one number no one else puts on the screen: turnover, the 24 hour volume divided by the liquidity behind it. Everyone shows the price. Strak shows whether it's lying.

Stocks on the board·
Volume, 24h·
Above 12x now·
Hottest now·

Numbers in this strip are read from /api/registry when the page loads.

Why this exists

A tokenized stock on Solana trades in an AMM pool. The price you see is simply where the last trades left that pool, and the 24h volume next to it is the sum of those trades. Both numbers are easy to inflate: a wallet that swaps back and forth with itself moves volume up and nudges the price wherever it likes, and nothing on a normal price screen tells you it happened.

There is one thing a loop can't hide: how many times it had to push the pool's entire depth through itself to produce that volume. Real demand for a stock rarely turns a pool over dozens of times a day. Strak measures exactly that, for every tokenized stock on the chain, and colours the board by it.

Who it is for

  • Traders who want to know whether a price has a market behind it before they trade against it.
  • Researchers and writers who need a single, reproducible number for "this volume looks fake".
  • Builders who want the whole tokenized equity universe on Solana as one clean JSON file.

Getting started

Quick start

  1. Open the terminal. The board lists every stock, sorted by turnover, highest first. Click any column header to sort by it; click again to flip the order.
  2. Star what you follow. The star next to a stock puts it on the Watchlist tab. The list lives in your browser only.
  3. Read the colour of the row. No tint is normal trading. A violet edge means 12x to 50x. A green glow means above 50x: the volume is painted.
  4. Click a stock. The detail panel shows the verdict bar, candles, pool depth and how often the whole pool changes hands.
  5. Check the wrappers. If the same company trades under another issuer, the prices are listed side by side. A wide gap means one of the pools is not pricing the stock.
  6. Verify on chain. Every stock links to its mint and its pool on Solscan.
No account, no wallet. Strak is read-only. It never asks to connect a wallet and never places a trade.

Getting started

Reading the terminal

The board

Each row is one tokenized stock: its symbol, name and issuer dot, price, 24h change, 24h volume and turnover. The row's tint follows the turnover band. Above the table:

  • Issuer tabs: All, Backpack, xStocks, Ondo, each with its live count, and Pre-IPO on the right, which swaps the board for a separate universe rather than filtering it.
  • Search: matches symbol (NVDAx), plain ticker (NVDA) or company name.
  • Sort: Turnover, Volume, Depth (liquidity), Change, A to Z.
  • Above 12x only: hides everything in the normal band.

The tape across the top runs the 24 highest turnovers with their 24h change. The status pill shows the US equity session in New York time (pre-market, open, after hours, closed), because the stocks these tokens track only move on news and fundamentals during that session.

The detail panel

BlockWhat it shows
Verdict barTurnover on a log scale from 0.1x to 200x, with marks at 12x and 50x, the band name and a one-line reading.
ChartCandles for the whole token, every pool at once, from 1 second to 1 day (1s, 15s, 1m, 5m, 15m, 1H, 4H, 1D), in price or in market cap, with volume along the bottom. Scrolling to the left edge loads older candles, back to the first trade. Indicators switch MA 7, MA 25, MA 99 and volume on and off. The rail on the left draws trend lines and horizontal price lines; the bin removes them. Below the chart, 1d, 7d, 30d and 180d pick a span and a timeframe that fits it, and %, log and auto change the price scale. The camera saves the chart as an image. New candles arrive every 2 seconds on 1s and up to every 2 minutes on 1D while the chart is open.
Volume 24hBuy plus sell volume across the token's pools, in USD.
Pool liquidityUSD liquidity behind the token.
Pool turns over every1440 minutes divided by turnover: how often, at this pace, the whole depth changes hands.
Trades 24hNumber of buys plus sells.
HoldersWallets holding the token.
Jupiter organic scoreJupiter's own 0 to 100 estimate of how organic the token's activity is. Shown for reference; Strak does not use it in turnover.
Who trades itThe last 300 swaps across every pool of the stock: trades a minute, median trade, distinct wallets, the share carried by the top three, and how many wallets both bought and sold. Refreshes every 30 seconds.
Other issuersThe same company under other wrappers: price, difference from the selected one, turnover.
LinksToken and pool on Solscan, the pair on DexScreener, and which DEX and quote asset the pool uses.

The board refreshes itself every two minutes. The timestamp under the table says whether you are looking at the live registry or the static snapshot.

Method

Turnover

Turnover is the whole product in one ratio:

turnover=volume 24h÷liquidity

Both inputs are in US dollars and cover the same token over the same 24 hours, so the ratio has no unit. It reads as "how many times did the traded volume cover the depth behind the price". A turnover of 3x means the day's trades added up to three times the pool.

Turnover as time

A ratio is easy to compute and hard to feel. Strak also shows it as time: if a day has 1440 minutes and the pool turned over t times, the whole depth changed hands once every 1440 / t minutes.

TurnoverWhole pool changes hands every
1x24 hours
3x8 hours
12x2 hours
50x29 minutes
150xunder 10 minutes

A worked example

Live, from the registry

Loading the hottest stock on the board…

Precision

Turnover is computed once per registry build and rounded to two decimals. Volume and liquidity come from the same Jupiter record, so both sides of the ratio are always from the same moment.

Method

The three bands

Every stock falls into one of three bands. The counts are live.

up to 12xNormal trading

Volume fits what the pool can carry. The whole depth changes hands no faster than every two hours.

·
12x to 50xSuspiciously hot

Volume runs far ahead of depth. It can be news or an earnings day, it can be a loop. Open the chart before trusting the price.

·
above 50xVolume is painted

The pool would have to change hands more than twice an hour, around the clock. Treat the price as unquoted.

·

Why 12x and 50x

The thresholds are heuristics, not laws of nature, and they are stated in the open so anyone can argue with them. They come from turning the ratio into time:

  • 12x is a full turn of the pool every two hours for 24 hours straight, including the hours when the underlying US market is closed and nothing new is known about the company. A busy, healthy pool can get there on a big news day; it rarely stays there.
  • 50x is a full turn every half hour, all day and all night. At that pace the same dollars would have to cross the pool again and again. Real demand for a stock does not look like that. A loop of trades does.

Values are compared with > 12 and > 50: exactly 12.00x is still normal, exactly 50.00x is still hot.

Method

Who makes the volume

Turnover says the volume does not fit the pool. It does not say who is producing it. For that, Strak reads the stock's last 300 swaps, across every pool, and groups them by wallet. Four numbers come out, and together they separate a busy market from a loop.

NumberWhat it meansWhat a loop looks like
Distinct walletsHow many addresses traded in the window.Few wallets carrying a lot of volume.
Top 3 shareShare of the window's volume carried by the three biggest wallets.Above half, sustained.
Bought and soldWallets that did both inside the same window, and the share of volume they carry.A round trip is what wash trading is made of.
Trades a minute, median tradeThe pace, and the size of a typical trade.A fast, even drum of near-identical small trades.
None of these is proof on its own. Market makers quote both sides for a living, so a wallet that bought and sold is doing its job, not necessarily faking. Arbitrage between two wrappers of the same stock also shows up as round trips. Read these next to turnover, not instead of it.

The same numbers are on the landing page for the hottest pools, updating every 20 seconds, and under every chart in the terminal. Through the API they come from /api/trades.

Method

What turnover can't tell you

Turnover is a screen, not a verdict from a court. Read it with these limits in mind:

  • High is not proof. Earnings, index news or a sudden re-rating can push an honest pool into the hot band for a day. Look at the chart and at the other wrappers before concluding anything.
  • Low is not a clean bill. A pool can be manipulated with little volume, for example by one large trade in a thin pool. Low turnover only says the volume is plausible.
  • Thin pools are noisy. A stock needs at least $5K of liquidity to be on the board, but near that floor a single trade moves the ratio a lot.
  • 24 hours is a window. A burst an hour ago and a steady day can produce the same number. The candles show which it was.
  • Aggregator data. Volume and liquidity are Jupiter's figures for the token across its pools. Strak does not recount swaps itself; every figure links to the chain so it can be checked.

Method

Case files

Dated snapshots from past registry runs. They are not live data, and each one carries the date of the run it came from.

23.09.2026Volume is painted

IONQ, Backpack Securities: 152.4x

Volume 24h$16.5M
Liquidity$108K
Turnover152.4x
Pool turns every9 min

On the first registry run, IONQ from Backpack Securities reported $16.5M of volume against $108K of liquidity. To produce that honestly, the whole pool would have had to change hands roughly every nine minutes for a full day. It was the highest turnover on the board by a wide margin; the next stock was around 33x.

Two days later, on 25.09.2026, the same token read 3.7x: $413K of volume on $111K of liquidity. The depth barely moved. The volume fell by a factor of forty.

Data

Universe and issuers

Strak covers tokenized stocks from three issuers. Each one names its tokens its own way, which is how the same company can appear two or three times.

IssuerJupiter tagTicker styleOn the board now
Backpack Securitiesbackpackno suffix: IONQ, HIMS·
xStocks (Backed)xstockssuffix x: NVDAx, SPYx·
Ondo Global Marketsondosuffix on: SPYon·

Inclusion rules

A token is on the board when all of these hold:

  1. It is in Jupiter's verified token list.
  2. It carries one of the issuer tags above.
  3. It does not carry the unknown tag. Copies that reuse a real ticker are tagged this way and are dropped.
  4. It has at least $5,000 of liquidity. Below that a pool is decoration, not a market. Issuers mint many listings nobody trades; this rule removes them.
  5. It is the deepest listing of its ticker for that issuer. If an issuer has two tokens with the same ticker, the one with more liquidity stays.

Tokens tagged as stocks but without an issuer tag are not included.

Tickers and symbols

Every record carries two names. symbol is the token's own symbol (NVDAx). ticker is the plain company ticker with the issuer suffix removed (NVDA). The terminal groups wrappers of one company by ticker.

Data

Pre-IPO tokens

A second, smaller universe trades on Solana: tokens that track companies with no listed shares at all. OpenAI, Anthropic, SpaceX, Neuralink, Anduril, Polymarket, Kalshi, Figure AI. Two issuers compete on the same names, PreStocks and Tessera, the second prefixing its symbols with a t.

They sit on their own tab and never mix into the board, because they break the assumption everything else rests on.

A tokenized listed stockA pre-IPO token
Behind the tokenA real share, held by a custodianA claim on a company whose shares are not traded
Reference priceThe exchange price of that shareNone. The pool price is the only price
Can the price be checked?Yes, against the marketNo, there is nothing to check it against
Do two wrappers agree?Yes, within a fraction of a percentNot comparable: each issuer sets its own share fraction
This is why turnover matters more here, not less. For a listed stock, a strange price can be caught by comparing it to the exchange. For a pre-IPO token there is no such check, so how the volume relates to the pool is close to the only thing that can be verified at all.

How they are picked

Same liquidity floor of $5,000, same duplicate collapsing. The difference is the tag: a token joins this list when Jupiter tags it prestocks or tessera and it does not carry commodities. That last rule keeps out tokenized gold and silver, which are tagged as real-world assets but are not stocks in any sense.

Tokens tagged only stocks or rwa, with no issuer behind them, are in neither list.

In the API

They arrive as a separate preipo array next to equities, in exactly the same shape. count covers listed stocks only, so nothing that reads the board picks them up by accident.

JavaScript
const { equities, preipo } = await (await fetch('https://usestrak.xyz/api/registry')).json();

equities.length;   // listed stocks
preipo.length;     // pre-IPO, a separate universe

Data

Sources and refresh

Every number comes from a public, free API. Nothing is typed in by hand.

SourceWhat Strak takesRefresh
Jupiter verified token listThe universe, price, 24h buy and sell volume, 24h price change, liquidity, trade count, holders, organic score, iconRegistry rebuilt on request, cached 5 min
DexScreenerThe deepest pool per token, its DEX and quote asset, the pool's 24h, 6h and 1h price changeWith the registry
Jupiter chartsToken-level OHLCV for the terminal chart, in price or market cap, 1 second to 1 weekRead by the browser directly; the fallback route caches 3 to 20 s
Jupiter tradesThe latest swaps of every stock across all its pools, for "who trades" and the live swaps on the landing20 s
GeckoTerminalThe fallback for candles, swaps and sparklines when Jupiter does not answerSame as the route it stands in for

The pipeline

  1. Fetch Jupiter's verified list (one request, about 3,600 tokens).
  2. Filter by the inclusion rules and collapse duplicates.
  3. Ask DexScreener for the pairs of the remaining mints, 30 per request, and keep the deepest pair of each.
  4. Compute turnover and sort by volume.

A full build takes a few seconds. The CDN keeps each answer for five minutes, so one build serves every visitor in that window. If the upstreams fail, the site falls back to the static snapshot in /data/equities.json, and the terminal labels the board as a snapshot instead of live.

One scope for everything you read. Turnover uses Jupiter's token-level volume and liquidity, the chart is Jupiter's token-level candles, and the swaps are Jupiter's token-level trade feed, so all three count every pool. Only the pool link points at a single pool: the deepest one DexScreener reports.

Data

Field reference

Each entry in equities has these fields. Money is in US dollars.

FieldTypeMeaning
addressstringToken mint address, base58.
symbolstringToken symbol as the issuer minted it, e.g. NVDAx.
tickerstringCompany ticker without the issuer suffix, e.g. NVDA.
namestringToken name.
issuerstringbackpack, xstocks or ondo on the board; prestocks or tessera in preipo.
pricenumberPrice in USD.
liqnumberLiquidity in USD.
vol24number24h buy volume plus sell volume, USD.
turnovernumbervol24 / liq, two decimals.
change24number24h price change, percent.
txns24number24h buys plus sells.
holdersnumberHolder count.
organicnumberJupiter organic score, 0 to 100.
iconstring | nullLogo URL from the token metadata.
poolstringAddress of the deepest pool. Missing when no pool was found.
dexstringDEX of that pool, e.g. raydium, orca, meteora.
quotestringThe other asset in the pool, e.g. USDC, SOL.
createdMsnumber | nullWhen the pool was created, Unix milliseconds.
pcnumber[]The pool's price change over 24h, 6h and 1h, percent, in that order.

The envelope around the list:

{
  "updatedAt": 1790370000000,     // when this build ran, Unix ms
  "chain": { "name": "Solana", "id": "solana" },
  "count": 93,                    // listed stocks only
  "equities": [ … ],
  "preipo": [ … ],                // same shape, see Pre-IPO tokens
  "live": true                    // only on /api/registry
}

Developers

API overview

The same endpoints the site runs on are open to anyone. No key, no sign up. Responses are JSON, served from the site's own origin with CDN caching.

EndpointReturnsCached
GET /api/registryThe live board5 min
GET /api/candlesOHLCV for one stock45 s
GET /api/tradesThe last swaps in a pool and who made them20 s
GET /api/sparks24 hourly closes for the landing's pools30 min
GET /data/equities.jsonStatic snapshot of the board60 s
GET /data/cases.jsonDated case files60 s
Be gentle. The upstreams behind these routes are free and rate limited. Poll the registry no faster than every few minutes; faster polling returns the same cached answer anyway.

Developers

GET /api/registry

Builds the board from Jupiter and DexScreener and returns it in the shape described in Field reference, with "live": true.

curl
curl -s https://usestrak.xyz/api/registry | jq '.equities | sort_by(-.turnover) | .[0:5] | map({symbol, turnover})'
JavaScript
const res = await fetch('https://usestrak.xyz/api/registry');
const { equities, updatedAt } = await res.json();

const hot = equities.filter((e) => e.turnover > 12);
console.log(`${hot.length} stocks above 12x as of ${new Date(updatedAt).toISOString()}`);
StatusMeaning
200The board. Cache-Control: s-maxage=300, stale-while-revalidate=900.
502{"error": "registry unavailable"}. Upstream down; fall back to /data/equities.json.

Developers

GET /api/candles

The chart's fallback. The terminal reads Jupiter's chart API straight from the browser; when that fails, it asks here. This route asks Jupiter from the server and, if Jupiter is down too, GeckoTerminal for the token's deepest pool. The answer has the same shape either way.

ParamDefaultRules
mintrequiredThe stock's address, base58, 32 to 44 characters.
interval15_MINUTE1_SECOND, 15_SECOND, 1_MINUTE, 5_MINUTE, 15_MINUTE, 30_MINUTE, 1_HOUR, 4_HOUR, 1_DAY or 1_WEEK.
typepriceprice or mcap (market cap).
candles500How many, 1 to 1000, ending at to.
tonowUnix milliseconds. Pass the first candle's time minus one to page back through history.
poolnoneThe stock's pool, used only if the route has to fall back to GeckoTerminal (1 minute and up, price only).
curl
curl -s "https://usestrak.xyz/api/candles?mint=<mint>&interval=1_HOUR&candles=100"

Answer: {"candles": [{"time", "open", "high", "low", "close", "volume"}, …], "source": "jupiter"}, oldest first, time in Unix seconds, prices and volume in USD. source says which upstream answered.

StatusMeaning
400bad mint, bad pool or bad interval.
502No source answered. Retry after a few seconds.

Developers

GET /api/trades

The latest swaps of one stock across all its pools, newest first, with the wallet behind each and a summary of who is carrying the volume. Source is Jupiter's trade feed, read 30 at a time up to 300 swaps or five seconds, whichever comes first; the CDN keeps the answer 20 seconds. If Jupiter does not answer and a pool is given, GeckoTerminal's last 300 swaps of that pool stand in, and scope in the answer says pool instead of token.

ParamDefaultRules
mintrequiredThe stock's address, base58, 32 to 44 characters.
poolnoneThe stock's pool, used only for the GeckoTerminal fallback. ?pool= alone still works and reads that pool only.
curl
curl -s "https://usestrak.xyz/api/trades?mint=<mint>" | jq .stats
{
  "trades": [
    { "t": 1790372807000, "kind": "buy", "usd": 23.87, "wallet": "H9fi…enKm", "tx": "5XVj…EdJ9" }
  ],
  "stats": {
    "count": 300,          // swaps read
    "usd": 37988.96,       // their total value
    "wallets": 189,        // distinct addresses
    "minutes": 10.2,       // how long those 300 swaps took
    "perMin": 29.46,
    "median": 43.12,       // median trade, USD
    "top3Share": 0.3782,   // share of volume carried by the three biggest wallets
    "roundTripWallets": 37,
    "roundTripShare": 0.1337,
    "top": [ { "wallet": "4K9G…BLrs", "usd": 5711.27, "n": 3, "buy": 3, "sell": 0 } ]
  }
}

Only the 60 most recent swaps are returned in trades; stats always covers all 300. Statuses match the candles route: 400 for a bad address, 429 when the upstream is rate limiting, 502 otherwise.

Developers

GET /api/sparks

24 hourly closes for the pools the landing page draws sparklines for: the 8 highest turnovers and the 22 most traded stocks. It takes no parameters on purpose: one constant URL means the CDN holds one answer for half an hour, and the whole site costs about 30 upstream calls per half hour. Closes come from Jupiter's hourly candles for the whole token, with GeckoTerminal as the fallback.

{
  "sparks": { "<pool>": [44.1, 44.3, …, 44.9] },   // oldest first
  "count": 25,                                  // pools answered
  "of": 25                                      // pools asked
}

When fewer than 60% of pools answered, the response is cached for one minute instead of thirty, so a rate-limited batch is not pinned. Where a pool has no candles, the landing draws a coarse line from the pool's own pc field: four real points at 24h, 6h, 1h and now.

Developers

Static files

/data/equities.json is the board as of the last deploy, in the same shape as the live route without live. Use it as a fallback or when you need a fixed snapshot. /data/cases.json holds the dated case files.

Separately, the whole board is snapshotted every hour and kept. That record is what the Turnover over time panel under each chart is drawn from, and every stock seen above 50x in it is kept as a dated case.

Reference

Glossary

AMM pool
A smart contract holding two assets, for example a stock token and USDC. The price is set by the ratio of the two, and every trade moves it.
Liquidity
The USD value sitting in the pools behind a token. It is how much a trade can lean on before the price moves a lot.
Volume, 24h
The USD value of all buys and sells of the token in the last 24 hours.
Turnover
Volume divided by liquidity. How many times the day's trading covered the depth.
Wash trading
Trading with yourself, or with a friendly counterparty, to create volume and move a price without real demand.
Issuer
The company that holds the real shares and mints the token that tracks them: Backpack Securities, Backed (xStocks) or Ondo.
Wrapper
One issuer's token for a company. NVDAx is the xStocks wrapper of NVIDIA.
Price gap
The difference between two wrappers of the same company. Both track the same share, so a wide gap means one pool is not pricing it.
Pre-IPO token
A token tracking a company whose shares are not publicly traded. There is no exchange price behind it, so nothing to check the pool price against.
Mint
A token's address on Solana.

Reference

Changelog

Board columns sort on click, both ways. A Watchlist tab for starred stocks. Swaps and sparklines moved to Jupiter too, across all pools of a stock. Candles now come from Jupiter for the whole token, every pool at once, so every stock and pre-IPO token has a chart and the chart counts the same trades as turnover. Timeframes from 1 second to 1 day, price or market cap, older candles on scrolling left, faster switching with the last view kept in memory. A chart in the layout traders know: drawing rail, indicators, ranges and scale modes.

A Pre-IPO tab for tokens tracking private companies, kept apart from the board. Swaps per pool: who makes the volume, on the landing and under every chart. Candles moved to a proper trading chart with 1m to 1D timeframes and moving averages. An hourly snapshot of the whole board, drawn as turnover over time under every chart. Landing rebuilt around a live copy of the terminal. Sparklines from GeckoTerminal with a coarse fallback from pool price change. Issuer deep links. This documentation.

Strak goes live: the terminal, the landing and a live registry route that rebuilds the board every five minutes.

First registry run: 90 stocks from three issuers. IONQ at 152.4x becomes the first case file.

Reference

Disclaimer

Strak is an informational tool. Nothing on this site is financial advice, an offer or a recommendation to buy or sell anything. Turnover describes how reported volume relates to pool depth; it does not predict prices and it does not prove misconduct. Data comes from third parties and can be late, incomplete or wrong. Check anything that matters on chain before acting on it.