> The index of these docs, for agents: https://traktor.fun/llms.txt

# Public market and search

Reading market resources and searching tokens over plain HTTP.

Both routes answer anyone, from any origin and with no key, within the limits on their endpoint blocks.

### `GET /v1/public/market`

One market resource's committed view, the same body Traktor's own pages read.

- URL: `https://api.traktor.fun/v1/public/market`
- Credential: None

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `resource` | query | enum | yes |  | flow, tape, marketSwaps, token, quote, tokenHolders, tokenSwapTraders, tokenSignals, tokenTrades, tokenTopBuys, tokenTopTraders, tokenPoolSwaps, tokenCandles, saved, stocks, feed, assets, perps, perpMarket, perpTraders, perpAccount, traderDirectory, traderFlows, trader, traderPortfolio, pool | Which resource to read. |
| `query` | query | string | no |  |  | The resource's parameters as one URL-encoded query string. |

Resources:

| Resource | Keys | Example query | What it answers |
| --- | --- | --- | --- |
| `flow` | the market keys, `views`, `view`, `limit`, `sort`, `dir`, `tail`, `named`, `offset`, `minPnl`, `minWinRate`, `marks`, `namedOnly` | `chain=bnb&platform=fomo&window=240&views=tokens&sort=mcap&limit=40` | The board's combined views over a market query. |
| `tape` | the market keys, `minPnl`, `minWinRate`, `marks`, `namedOnly` | `chain=bnb&platform=gmgn&side=buy&minTrade=500` | The newest tracked-app trades by arrival, at most 120, with no summary. |
| `marketSwaps` | `chain`, `address`, `platform`, `scope`, `window`, `limit` | `scope=market&chain=base&address=0x4444444444444444444444444444444444444444` | Executions in a token's pools by every app, or only the tracked apps. |
| `token` | `chain`, `address`, `interval` | `chain=bnb&address=0x2222222222222222222222222222222222222222&interval=5m` | One token's detail and candles. |
| `quote` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | One token's current valuation; a Solana mint keeps its case. |
| `tokenHolders` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | One token's holder list. |
| `tokenSwapTraders` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | What each trader in one token's newest swaps did in the token, as a data provider counts its swaps, keyed by wallet. |
| `tokenSignals` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | One token's signals. |
| `tokenTrades` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | One token's newest tracked-app swaps by block time, each field null when never measured; `platform` is `traktor` for a swap the tape booked as fomo's from a wallet Traktor made for one of its accounts. |
| `tokenTopBuys` | `chain`, `address`, `side` | `chain=bnb&address=0x2222222222222222222222222222222222222222&side=all` | What the top 10,000 traders by year profit, the top traders' flow's widest tier, bought or sold of one token over the tape's day, newest first: each trader's buys and sells a minute, the side not read null, the dollars null where none was priced and the tokens null where their rows were not read, with each trader's realized week, month and year as measured, a week or month unmeasured null, and every wallet the directory lists for them. |
| `tokenTopTraders` | `chain`, `address`, `window`, `offset` | `chain=bnb&address=0x2222222222222222222222222222222222222222&window=60` | Who among the same top 10,000 traders traded one token over one of the board's windows: each one's priced dollars each way, trades, unpriced trades, apps, last trade, whether their last trade of it over the day was a buy, every wallet the directory lists for them and their PnL in the token where a data provider has answered for each of their wallets, the most bought first, 50 named a page from `offset` and the rest past it counted; and every one of them added up as the board row's `topTradersFlow`, with each app's buyers; and `others`, every other wallet's buys over the same minutes added up the same way, null where the server's held trades don't reach back over the window, after its syncs spoiled two reads of them running, or when the read fails. A trader nobody names has a null name, never their address as one. |
| `tokenPoolSwaps` | `chain`, `address` | `chain=bnb&address=0x2222222222222222222222222222222222222222` | One token's swaps on its market pool from the every-swap feed, newest first: the post-swap dollar price the chart's live candle rolls from (`swaps`), and the pool's newest swaps priced or not, each with its transaction and the wallet that made it where the chain proves one (`listed`); `feed` is `none` where the feed does not cover the pool. |
| `tokenCandles` | `chain`, `address`, `interval`, `limit`, `before` | `chain=bnb&address=0x2222222222222222222222222222222222222222&interval=5m` | One token's price candles; `before`, in Unix seconds, pages back. |
| `saved` | `tokens`, `window` | `tokens=bnb:0x2222222222222222222222222222222222222222&window=60` | A watchlist's rows. |
| `stocks` | the market keys, `rank`, `stock`, `offset`, `sort`, `dir` | `rank=volume` | Stock-paired tokens grouped by their stock. |
| `feed` | the market keys, `since`, `limit`, `types`, `tiers` | `limit=50` | The signal feed. |
| `assets` | none |  | The verified stock registry. |
| `perps` | `views`, `limit`, `window`, `rank`, `coin`, `minVolume`, `minOi`, `minLev`, `funding`, `side`, `minTrade`, `delisted` | `views=markets&limit=50` | The perps board; refused with `invalid_query` while the service runs without perps. |
| `perpMarket` | `coin`, `window` | `coin=BTC&window=60` | One perp market; refused with `invalid_query` while the service runs without perps. |
| `perpTraders` | `sort`, `dir`, `vaults`, `minValue`, `minVolume`, `offset`, `limit` | `sort=pnlWeek&limit=50` | The top 1,000 perps accounts by 30-day perps profit among those the tape has seen trade $50,000 in a day, screened, sorted and paged: each one's rank among the users and subaccounts, its perps profit and volume over a day, a week, 30 days and all time as last scored, its account value, its largest position and how many it holds while it is followed, its win rate once its fills are read, and its page code (`code`, null until its next score writes one), a figure not measured null. A vault has no rank and keeps its documented name, and no other account is named. Refused with `invalid_query` while the service runs without perps. |
| `perpAccount` | `code` | `code=Ab3dEf6hIj9k` | One ranked perps account's page, found by the code its row on `perpTraders` carries, never by an address: its rank, its perps profit and volume over the four windows as last scored, its account value, every position it holds while it is followed, its win rate once read, and the fills our tape saw it take over the last day as the aggressor, by hour, by market and by minute, the newest 100 minutes. A code no ranked account carries answers `missing`, and what it took is null until the day's takers are all counted. Refused with `invalid_query` while the service runs without perps. |
| `traderDirectory` | `sort`, `dir`, `chain`, `platform`, `window`, `q`, `side`, `minVolume`, `minTrades`, `minHoldings`, `minPnl`, `minWinRate`, `minAvgTrade`, `minActiveHours`, `launchpad`, `dex`, `fees`, `pair`, `minMcap`, `maxMcap`, `minLiq`, `maxLiq`, `minLiqPct`, `minHolders`, `minFomoHolders`, `minHeldPct`, `minAth`, `maxAth`, `maxAge`, `minAge`, `minCurve`, `maxCurve`, `offset`, `limit` | `sort=pnl&limit=50` | The traders directory, screened and paged. With any of the Board's token filters, only traders with a year measured who traded a passing token in the window are listed, their window, day and active hours counted in those tokens alone, their year, holdings and dates the account's. |
| `traderFlows` | `top`, `window`, `chain`, `platform`, `side`, `offset`, `launchpad`, `dex`, `fees`, `pair`, `minMcap`, `maxMcap`, `minLiq`, `maxLiq`, `minLiqPct`, `minHolders`, `minFomoHolders`, `minHeldPct`, `minAth`, `maxAth`, `maxAge`, `minAge`, `minCurve`, `maxCurve` | `top=10000&window=60` | What the traders directory's best by year profit bought and sold over the window, token by token: the busiest 48, and the 10 bought and the 10 sold the most by net, each with its market on the Board's day, and how many they netted each way. With `side`, a page of 20 of that side by net instead. Lists only the tokens the Board's day lists, and takes the Board's token filters. |
| `trader` | `wallet` | `wallet=0x1111111111111111111111111111111111111111` | One wallet's profile. |
| `traderPortfolio` | `wallet` | `wallet=0x1111111111111111111111111111111111111111` | The trader page's read of one wallet and its fomo account's wallet of the other kind, from a data provider: their performance, holdings, newest trades and every token they traded, with the account. |
| `pool` | `chain`, `token` | `chain=bnb&token=0x55d398326f99059ff775485246999027b3197955` | One token's pool depth: `state: "ok"` with the deepest readable pool's price ranges, price and caps, or `state: "error"` and a `code`. |

The market keys: `window`, `chain`, `platform`, `wallets`, `launchpad`, `dex`, `fees`, `pair`, `side`, `minTrade`, `minBalance`, `minNet`, `maxNet`, `minVolume`, `minBuyers`, `minSellers`, `minTrades`, `minRatio`, `minChange`, `maxChange`, `minTopTraders`, `minMcap`, `maxMcap`, `minLiq`, `maxLiq`, `minLiqPct`, `minHolders`, `minFomoHolders`, `minHeldPct`, `minAth`, `maxAth`, `maxAge`, `minAge`, `minCurve`, `maxCurve`.

`flow` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `views` | query | list | no | all | all, summary, tokens, series, tape, rotation, wallets | Views to build, comma-separated; `all` builds every one. Send `views` or `view`, not both. |
| `view` | query | list | no |  | all, summary, tokens, series, tape, rotation, wallets | The same as `views`; send one of the two. |
| `limit` | query | integer | no | 100 | 1–1,000 | Token rows, read only with `tokens` or `all`; with no `limit`, a read gets 100 when `views` is left out, is exactly `all` or names `tokens`, and no default limit when it lists `all` beside other views without `tokens`. |
| `sort` | query | enum | no | volume | volume, net, pressure, turnover, conviction, bought, sold, buyers, trades, avg, price, change15m, change1h, change4h, change24h, mcap, held, fomoPnl, heldPct, liquidity, liqRatio, age, fomoHolders, holderTrend, ath, graduation, holders, topTraders | Token ranking, read only with `tokens` or `all`. |
| `dir` | query | enum | no | desc | asc, desc | Ranking direction, read only with `tokens` or `all`. |
| `tail` | query | boolean | no | false |  | Includes both ends of the ranking, as `1`, `0`, `true` or `false`; the far end holds only rows that have the ranked figure, and it cannot go with `offset`. |
| `named` | query | boolean | no | false |  | Keeps only tokens with a name, as `1`, `0`, `true` or `false`. |
| `offset` | query | integer | no | 0 | 0–100,000 | Token rows to skip before the page of `limit` rows, read only with `tokens` or `all`; it cannot go with `tail`, and where `limit` has no default, as with `all` listed beside other views without `tokens`, it needs a `limit` sent with it. |
| `minPnl` | query | number | no |  | -1,000,000,000,000–1,000,000,000,000 | Keeps trades by wallets that realized at least this over the last year, in USD, which may be negative; a wallet with no year measured within the day never clears it. Only with `views=tape`, and it narrows the tape alone. |
| `minWinRate` | query | number | no |  | 0–100 | Keeps trades by wallets whose win rate over the last year is at least this, in percent; a wallet with none measured never clears it, even at 0. Only with `views=tape`, and it narrows the tape alone. |
| `marks` | query | list | no |  | kol, smart_money | Keeps trades by wallets a source labels with any of these. Only with `views=tape`, and it narrows the tape alone. |
| `namedOnly` | query | boolean | no | false |  | Keeps trades by wallets some source names, as `1`, `0`, `true` or `false`. Only with `views=tape`, and it narrows the tape alone. |

`tape` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `minPnl` | query | number | no |  | -1,000,000,000,000–1,000,000,000,000 | Keeps trades by wallets that realized at least this over the last year, in USD, which may be negative; a wallet with no year measured within the day never clears it. |
| `minWinRate` | query | number | no |  | 0–100 | Keeps trades by wallets whose win rate over the last year is at least this, in percent; a wallet with none measured never clears it, even at 0. |
| `marks` | query | list | no |  | kol, smart_money | Keeps trades by wallets a source labels with any of these. |
| `namedOnly` | query | boolean | no | false |  | Keeps trades by wallets some source names, as `1`, `0`, `true` or `false`. |

`marketSwaps` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | list | no |  | solana, robinhood, bnb, base, arc, arbitrum | Chains to read, comma-separated; empty means every chain it covers, all but ethereum, monad, hyperevm and elysium. A chain it does not cover is refused, and a token `address` needs exactly one chain. |
| `address` | query | address | no |  |  | Narrows to one token's pools; needs exactly one `chain`, and a Solana mint keeps its case. |
| `platform` | query | list | no |  | fomo, gmgn, pump, axiom, coinbase, padre, maestro, bloom, trojan, bonkbot, bankr, photon | Tracked apps to keep, comma-separated; needs `scope=tracked-apps`. |
| `scope` | query | enum | no | market | market, tracked-apps | Every app's swaps, or only the tracked apps'; `platform` needs `tracked-apps`. |
| `window` | query | integer | no | 60 | 1–10,080 | How far back, in minutes; reaches past the board's windows. |
| `limit` | query | integer | no | 120 | 1–120 | Swaps to return. |

`token` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |
| `interval` | query | enum | no | 5m | 1m, 5m, 15m, 1h, 4h, 12h, 1d | Candle width. |

`quote` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenHolders` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenSwapTraders` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenSignals` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenTrades` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenTopBuys` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |
| `side` | query | enum | no | buy | buy, sell, all | The buys, the sells or both; with none named, the buys, and `sells` is null. |

`tokenTopTraders` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |
| `window` | query | enum | no | 60 | 5, 15, 30, 60, 240, 1440 | The window, in minutes: one of the board's. |
| `offset` | query | integer | no | 0 | 0–9,950 | Traders to skip before the page, a multiple of 50. |

`tokenPoolSwaps` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |

`tokenCandles` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | query | address | yes |  |  | The token's contract address; a Solana mint keeps its case. |
| `interval` | query | enum | no | 5m | 1m, 5m, 15m, 1h, 4h, 12h, 1d | Candle width. |
| `limit` | query | integer | no | 300 | 1–1,000 | Candles to return. |
| `before` | query | integer | no |  | from 1 | Only candles before this Unix time, in seconds. |

`saved` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `tokens` | query | list | no |  | up to 200 items | Saved tokens as `chain:address`, comma-separated, on solana, base, bnb, robinhood, arc or ethereum; an empty list is an empty watchlist. |
| `window` | query | enum | no | 60 | 5, 15, 30, 60, 240, 1440 | How far back, in minutes; one of the dashboard's. |

`stocks` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `rank` | query | enum | no | volume | volume, net, mcap | How the stock groups rank. |
| `stock` | query | string | no |  |  | Narrows to one stock group: `ticker:AAPL`, or `address:<chain>:<token>` on any chain the stock registry reads, a `0x…` contract or a Solana mint. |
| `offset` | query | integer | no | 0 | 0–100,000 | Rows to skip inside the stock group; needs `stock`. |
| `sort` | query | enum | no |  | volume, net, pressure, turnover, conviction, bought, sold, buyers, trades, avg, price, change15m, change1h, change4h, change24h, mcap, held, fomoPnl, heldPct, liquidity, liqRatio, age, fomoHolders, holderTrend, ath, graduation, holders, topTraders | Orders each stock group's tokens, before `offset`; without it they follow `rank`. |
| `dir` | query | enum | no | desc | asc, desc | Direction of `sort`. |

`feed` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `since` | query | string | no |  |  | The `cursor` a previous read returned, an ISO 8601 time: only signals that landed after it, at most 72 hours back. When more landed than `limit`, the page holds the earliest and its cursor leads to the rest; signals stored together stay on one page, past `limit` if they must, though a batch of more than 1,000 keeps only its first 1,000. The most recent arrive on a later read, usually within a few seconds. A read without `since` can hand back a cursor a few seconds behind its newest signal, so the next read may repeat those. |
| `limit` | query | integer | no | 150 | 1–400 | Signals to return. |
| `types` | query | list | no |  | net_in, net_out, vol_spike, buyers, buy_pressure, sell_pressure, dip_buy, rotation, whale_buy, whale_sell, top_buy, top_sell, kol_buy, smart_buy, dev_buy, dev_sell, insider_buy, smart_cluster, top_cluster, top_exit, top_early, top_net, holders_up, holder_surge, holder_exodus, supply_share, holder_growth, mcap_up, pump, dump, ath, pump_fade, new_token, graduation, revival, dex_paid, dex_boost, cto, liq_add, liq_pull | Signal types to keep, comma-separated; empty keeps every type. They are kept among the same newest 1,000 stored signals the header's filter reads, before `limit`, and `status.leftOut` says whether they left out one the filter kept. A name outside the vocabulary is ignored. |
| `tiers` | query | list | no |  | 1, 2, 3 | Tiers to keep, comma-separated; empty keeps every tier. Kept as `types` is. |

`perps` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `views` | query | list | yes |  | markets, hot, tape, oi, funding, flow, traders | Views to build, comma-separated; there is no default. |
| `limit` | query | integer | no | 400 | 1–400 | Market rows to return. |
| `window` | query | integer | no | 60 | 1–1,440 | How far back, in minutes, from 1 to 1,440; read as the longest of 5, 15, 30, 60, 240 and 1,440 that fits, or 5 below it. |
| `rank` | query | enum | no | volume | volume, oi, oiChange, funding, change, net | How the markets rank; `oiChange` is the size of the window's open-interest change either way. |
| `coin` | query | list | no |  | up to 64 items | Coins to include, comma-separated; empty means every market. A coin as the venue writes it, like `BTC` or `kPEPE`, which is case-sensitive. |
| `minVolume` | query | number | no |  | 0–1,000,000,000,000,000 | Keeps markets with at least this much 24-hour volume, in USD; 0 is no floor. |
| `minOi` | query | number | no |  | 0–1,000,000,000,000,000 | Keeps markets with at least this much open interest, in USD; 0 is no floor. |
| `minLev` | query | number | no |  | 0–1,000,000,000,000,000 | Keeps markets whose top leverage is at least this; 0 is no floor. |
| `funding` | query | enum | no | any | any, longs, shorts, extreme | Keeps markets by who pays funding: `longs` above the floor of 0.01% every eight hours (about 11% a year) most markets sit on, `shorts` below zero, `extreme` at 50% a year or more either way. A rate nobody read passes none of them. |
| `side` | query | enum | no | all | all, buy, sell | Which side of the tape the trade panels show. |
| `minTrade` | query | number | no |  | 0–1,000,000,000,000,000 | The tape's smallest trade, in USD; 0 is no floor. |
| `delisted` | query | enum | no | 0 | 0, 1 | `1` includes delisted markets, which still trade down. |

`perpMarket` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `coin` | query | string | yes |  |  | A coin as the venue writes it, like `BTC` or `kPEPE`, which is case-sensitive. |
| `window` | query | integer | no | 60 | 1–1,440 | How far back, in minutes, from 1 to 1,440; read as the longest of 5, 15, 30, 60, 240 and 1,440 that fits, or 5 below it. |

`perpTraders` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `sort` | query | enum | no | rank | rank, pnlDay, pnlWeek, pnlMonth, pnlAllTime, volumeDay, volumeWeek, volumeMonth, volumeAllTime, accountValue | The ranking: by rank, by a window's perps profit or volume, or by account value; an account whose figure is unmeasured comes last either way. |
| `dir` | query | enum | no | desc | desc, asc | Ranking direction: `desc` puts the largest first, and for `rank` the first rank. |
| `vaults` | query | enum | no | exclude | exclude, include, only | Leaves vaults out, lists them beside the other accounts, or lists them alone. |
| `minValue` | query | number | no |  | 0–1,000,000,000,000,000 | Keeps accounts worth at least this, in USD; an account whose value is unmeasured never clears it, even at 0. |
| `minVolume` | query | number | no |  | 0–1,000,000,000,000,000 | Keeps accounts that traded at least this much in perps over 30 days, in USD; an account whose volume is unmeasured never clears it, even at 0. |
| `offset` | query | integer | no | 0 | 0–1,000 | Accounts to skip before the page. |
| `limit` | query | integer | no | 100 | 1–200 | Accounts to return. |

`perpAccount` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `code` | query | string | yes |  |  | The account's page code: twelve letters and digits, from its `perpTraders` row. |

`traderDirectory` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `sort` | query | enum | no | volume | volume, net, bought, sold, buyShare, trades, avgTrade, holdings, pnl, pnlMonth, pnlWeek, winRate, active, recent, firstSeen, rank | The ranking. |
| `dir` | query | enum | no | desc | desc, asc | Ranking direction. |
| `chain` | query | list | no | all | all, solana, robinhood, bnb, base, arc, arbitrum, ethereum, monad, hyperevm, elysium | Chains to read, comma-separated, or `all`; a name outside the vocabulary is refused. |
| `platform` | query | list | no | all | all, fomo, gmgn, pump, axiom, coinbase, padre, maestro, bloom, trojan, bonkbot, bankr, photon | Trading apps to read, comma-separated, or `all`; a name outside the vocabulary is refused. Naming some apps keeps only traders with a trade through one of them in the last 24 hours, counts the window on those apps alone, gives the last trade they made and no first trade, and leaves the year and holdings every app's. |
| `window` | query | enum | no | 1440 | 5, 15, 30, 60, 240, 1440 | The window the flow is measured over, in minutes. |
| `q` | query | string | no |  | up to 100 characters; longer text is cut | Searches handles, names and addresses, ignoring case; the first 100 characters are read. |
| `side` | query | enum | no | all | all, buying, selling | Keeps traders who bought more than they sold, or sold more than they bought; a trader whose net is unmeasured, as beside a side that traded with none of its trades priced, clears neither `buying` nor `selling`. |
| `minVolume` | query | number | no |  | 0–1,000,000,000,000 | Keeps traders with at least this much volume in the window, in USD; a trader none of whose trades in the window was priced clears only 0, which is no floor, and a trader whose day went unread clears none. |
| `minTrades` | query | integer | no |  | 0–1,000,000 | Keeps traders with at least this many trades in the window; 0 is no floor, though a trader whose day went unread clears none. |
| `minHoldings` | query | number | no |  | 0–1,000,000,000,000 | Keeps traders whose wallets hold at least this much now, in USD; a trader whose holdings are unread or hold nothing valued never clears it. |
| `minPnl` | query | number | no |  | -1,000,000,000,000–1,000,000,000,000 | Keeps traders who realized at least this over the last year on every chain, in USD, which may be negative; a trader with no year measured never clears it. |
| `minWinRate` | query | number | no |  | 0–100 | Keeps traders whose win rate over the last year is at least this, in percent; a trader with none measured never clears it. |
| `minAvgTrade` | query | number | no |  | 0–1,000,000,000,000 | Keeps traders whose average trade is at least this, in USD; a trader with no trades in the window, or none of them priced, never clears it. |
| `minActiveHours` | query | integer | no |  | 0–24 | Keeps traders active in at least this many of the last 24 hours; 0 is no floor, though a trader whose day went unread clears none. |
| `launchpad` | query | list | no |  |  | Launchpad families, as `market.launchpads` in `GET /v1/meta/filters` lists them, each optionally chain-qualified, like `bnb:flap`; a bare `other` or `unknown` is dropped and never narrows the list, though `bnb:other` is kept, and a name outside the catalogue is ignored. |
| `dex` | query | list | no |  | paid, boost, cto | DEX signals; a token with any of them matches, and a name outside the vocabulary is ignored. |
| `fees` | query | enum | no | any | any, shared, not_shared | Whether the token's launchpad shares its fees. |
| `pair` | query | list | no |  | up to 12 items | Stock tickers the token pairs with, or `ANY-STOCK` for any stock. |
| `minMcap` | query | number | no |  | 0–1,000,000,000,000,000 | Market cap at least. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxMcap` | query | number | no |  | 0–1,000,000,000,000,000 | Market cap at most. Tokens with no cap yet are kept — a brand-new one is small by definition. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minLiq` | query | number | no |  | 0–1,000,000,000,000,000 | Pool depth at least — what the token can absorb before price moves. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxLiq` | query | number | no |  | 0–1,000,000,000,000,000 | Pool depth at most. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minLiqPct` | query | number | no |  | 0–1,000,000,000,000,000 | Depth as a share of market cap — how much of the cap there is real money behind. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minHolders` | query | number | no |  | 0–1,000,000,000,000,000 | Wallets holding the token on chain, at least, as its data provider last counted them; a token nobody counted is in no band. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minFomoHolders` | query | number | no |  | 0–1,000,000,000,000,000 | Wallets on fomo still holding a position. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minHeldPct` | query | number | no |  | 0–1,000,000,000,000,000 | Share of circulating supply sitting in fomo wallets — how much of the token the crowd here owns. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minAth` | query | number | no |  | 0–1,000,000,000,000,000 | Multiple back to the all-time high, at least — headroom above the current price. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxAth` | query | number | no |  | 0–1,000,000,000,000,000 | Multiple back to the high, at most — near its own top. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxAge` | query | number | no |  | 0–1,000,000,000,000,000 | Younger than, in hours since the token launched on chain, or first traded on our tape where that came first or no launch is dated. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minAge` | query | number | no |  | 0–1,000,000,000,000,000 | Older than, in hours since the token launched on chain, or first traded on our tape where that came first or no launch is dated. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minCurve` | query | number | no |  | 0–1,000,000,000,000,000 | Bonding-curve progress, at least, in percent; a token that has graduated counts as 101. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxCurve` | query | number | no |  | 0–1,000,000,000,000,000 | Bonding-curve progress, at most, in percent; 100 keeps only tokens still on their curve. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `offset` | query | integer | no | 0 | 0–5,000 | Traders to skip. |
| `limit` | query | integer | no | 100 | 0–200 | Traders to return; 0 reads as the default, 100. |

`traderFlows` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `top` | query | enum | no | 10000 | 100, 500, 1000, 5000, 10000 | How many traders: the first of the directory's `pnl` ranking on the chains and apps asked for, among those with a year measured. |
| `window` | query | enum | no | 60 | 5, 15, 30, 60, 240, 1440 | The window, in minutes. |
| `chain` | query | list | no | all | all, solana, robinhood, bnb, base, arc, arbitrum, ethereum, monad, hyperevm, elysium | Chains to rank and count on, comma-separated, or `all`; a name outside the vocabulary is refused. |
| `platform` | query | list | no | all | all, fomo, gmgn, pump, axiom, coinbase, padre, maestro, bloom, trojan, bonkbot, bankr, photon | Trading apps to rank and count on, comma-separated, or `all`; a name outside the vocabulary is refused. Naming some apps ranks only traders with a trade through one of them in the last 24 hours, as the directory does. |
| `side` | query | enum | no |  | bought, sold | Reads a page of one side in place of the map: the tokens netted `bought` or `sold`, the most first; a token whose net is unmeasured is on neither. |
| `offset` | query | integer | no | 0 | 0–100,000 | Where the side's page starts; only with `side`. Each page is the next 20, read as the answer is, so a token near a page's edge can show on both or neither. |
| `launchpad` | query | list | no |  |  | Launchpad families, as `market.launchpads` in `GET /v1/meta/filters` lists them, each optionally chain-qualified, like `bnb:flap`; a bare `other` or `unknown` is dropped and never narrows the list, though `bnb:other` is kept, and a name outside the catalogue is ignored. |
| `dex` | query | list | no |  | paid, boost, cto | DEX signals; a token with any of them matches, and a name outside the vocabulary is ignored. |
| `fees` | query | enum | no | any | any, shared, not_shared | Whether the token's launchpad shares its fees. |
| `pair` | query | list | no |  | up to 12 items | Stock tickers the token pairs with, or `ANY-STOCK` for any stock. |
| `minMcap` | query | number | no |  | 0–1,000,000,000,000,000 | Market cap at least. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxMcap` | query | number | no |  | 0–1,000,000,000,000,000 | Market cap at most. Tokens with no cap yet are kept — a brand-new one is small by definition. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minLiq` | query | number | no |  | 0–1,000,000,000,000,000 | Pool depth at least — what the token can absorb before price moves. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxLiq` | query | number | no |  | 0–1,000,000,000,000,000 | Pool depth at most. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minLiqPct` | query | number | no |  | 0–1,000,000,000,000,000 | Depth as a share of market cap — how much of the cap there is real money behind. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minHolders` | query | number | no |  | 0–1,000,000,000,000,000 | Wallets holding the token on chain, at least, as its data provider last counted them; a token nobody counted is in no band. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minFomoHolders` | query | number | no |  | 0–1,000,000,000,000,000 | Wallets on fomo still holding a position. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minHeldPct` | query | number | no |  | 0–1,000,000,000,000,000 | Share of circulating supply sitting in fomo wallets — how much of the token the crowd here owns. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minAth` | query | number | no |  | 0–1,000,000,000,000,000 | Multiple back to the all-time high, at least — headroom above the current price. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxAth` | query | number | no |  | 0–1,000,000,000,000,000 | Multiple back to the high, at most — near its own top. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxAge` | query | number | no |  | 0–1,000,000,000,000,000 | Younger than, in hours since the token launched on chain, or first traded on our tape where that came first or no launch is dated. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minAge` | query | number | no |  | 0–1,000,000,000,000,000 | Older than, in hours since the token launched on chain, or first traded on our tape where that came first or no launch is dated. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `minCurve` | query | number | no |  | 0–1,000,000,000,000,000 | Bonding-curve progress, at least, in percent; a token that has graduated counts as 101. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |
| `maxCurve` | query | number | no |  | 0–1,000,000,000,000,000 | Bonding-curve progress, at most, in percent; 100 keeps only tokens still on their curve. A plain number, read exactly, on the Board's day, where a token it does not list yet is left out. |

`trader` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `wallet` | query | address | yes |  |  | The wallet's address; a Solana wallet keeps its case. |

`traderPortfolio` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `wallet` | query | address | yes |  |  | The wallet's address; a Solana wallet keeps its case. |

`pool` bounds:

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | query | enum | no | robinhood | robinhood, bnb | The token's chain. |
| `token` | query | address | yes |  |  | The token's EVM address. |

Limits:

- Requests: 120 a minute, per IP
- Reads waiting on a build: 64 at once, per server process
- Reads waiting on a build: 8 at once, per IP
- Reads with a sign-in, once enforced, every /v1/public/ route together: 1,000 a minute by default, per account

```bash cURL
curl -s "https://api.traktor.fun/v1/public/market?resource=tokenTrades&query=chain%3Dbase%26address%3D0x4444444444444444444444444444444444444444"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/public/market?resource=tokenTrades&query=chain%3Dbase%26address%3D0x4444444444444444444444444444444444444444");
const body = await response.json();
```

```python Python
import requests

response = requests.get(
    "https://api.traktor.fun/v1/public/market",
    params={"resource": "tokenTrades", "query": "chain=base&address=0x4444444444444444444444444444444444444444"},
)
print(response.json())
```

Response `200`:

```json
{
  "chain": "base",
  "address": "0x4444444444444444444444444444444444444444",
  "trades": [
    {
      "id": "base:0x5555555555555555555555555555555555555555555555555555555555555555:0",
      "timestamp": "2026-10-03T12:00:00.000Z",
      "side": "buy",
      "platform": "fomo",
      "usdAmount": 250.4,
      "priceUsd": 0.00041
    }
  ]
}
```

Errors: `invalid_query`, `method_not_allowed`, `rate_limited`, `sign_in_required`, `sign_in_unavailable`, `stream_capacity`, `market_unavailable`, `market_warming`, `market_fold_pending`, `filter_too_broad`, `server_draining`. Every code: https://traktor.fun/docs/errors.md

- The answer is the resource's JSON itself, with no `{ data, meta }` envelope. A key the resource does not take, a key given twice, or a parameter besides `resource` and `query` is `400 invalid_query`.
- The market keys read names leniently: a chain or app the vocabulary lacks is ignored, so `chain=polygon` answers for every chain and `chain=bnb,polygon` for `bnb` alone, where the metered routes refuse both. Every other `chain` key, on `marketSwaps`, `pool`, the token resources and the trader resources, refuses a name it does not know.
- A resource's own keys are bounded on the block, under its name; the market keys are listed there by name alone. Their amounts are plain numbers, so `minMcap=150k` is `400 invalid_query`. Every screen is answered for exactly the number you send, so the rows, totals and nodes are the screen's own and there is no surplus to drop. `filter.screens` in a `flow` or `tape` body echoes the values served. `marketSwaps` reaches further back than the board's windows.
- `tape` takes `minPnl`, `minWinRate`, `marks` and `namedOnly` to keep the trades of wallets by their own year, the marks a source gives them and whether any source names them. A wallet with no reading clears no floor, and each row of a tape so screened carries `walletYear`, the figures it passed on. `flow` takes them only with `views=tape`, and they narrow its tape alone. A server that has not yet loaded the wallets' figures answers `503 market_warming`.
- Each `tape` row carries `netUsd`, its token's net flow over the window, the hour where a market tape names none, as an unscreened `tokens` row sums it over the same apps: the market's figure, every wallet's, even under `wallets`. It is absent, never zero, where the server has not yet loaded the window's minute buckets, and `null`, as its token's row serves it, where a side of that token's flow traded with none of its trades priced.
- `tape`, under a launchpad, stock-pair, DEX-signal or fee screen, or a screen on who traded that holds more than 10,000 wallets, fails rather than answer a short list when too many candidates would have to be read.
- A `minBalance` floor that selects more than 5,000 wallets is `422 filter_too_broad`, over HTTP and as the socket's `unavailable` code, as the metered routes refuse it: raise the floor. A view already built under a floor that later crosses the limit is served stale instead, as after any failed rebuild.
- In `marketSwaps`, each hop of a route is its own execution, so it never totals a user's trade.
- `tokenTrades` marks a swap from a block not yet confirmed `unconfirmed: true`. Once the block is confirmed the swap is listed without the mark, or dropped if the block was replaced. A confirming swap can be missing for one update before it is listed again, so a missing swap alone does not mean its block was replaced.
- `tokenTopBuys` answers `503 market_warming` while the server ranks no trader with a measured year or holds none of their trades, never an empty list. A trader's `week` and `month` are `null` where they have not been measured, and until the server's first read of them, made once an answer names the trader, lands. A buy's `tokens` and `priceUsd` are `null` where its rows don't count its buys, and until the server's first read of them, made once an answer names the buy, lands. Each trader carries `wallets`, every wallet the directory lists for them, in the directory's order.
- `tokenTopTraders` answers `503 market_warming` as `tokenTopBuys` does, never an empty list. Its `summary` is the board row's `topTradersFlow` for the same `window`, with each app's buyers; `traders` names 50 at a time, the most bought first: `offset`, a multiple of 50 up to 9,950, starts the page there, every page carries the whole `summary`, and `more` counts the traders past the page. `others` is every other wallet that bought the token over the same minutes, from the trades the answering server holds: `buyUsd` (`null` where none of their buys was priced), `buyers` (wallets, so one person's two wallets are two), `unpriced` buys, and `apps`, each app's priced dollars and the wallets that made a priced buy there. It is `null` while that server's trades don't reach back over the window, when its syncs interrupted two reads of them running, or when the read fails, never an empty window. A trader nobody names has a `null` `name`; every trader, named or not, carries `wallets` as `tokenTopBuys` does. A trader's `coin` is their year in the token: `avgEntryUsd` and `avgExitUsd` (dollars a token each way), `realizedUsd`, and `heldBoughtTokens` and `costUsd` to value what they still hold at your price (both `null` where it can't be costed); it is absent until a data provider has answered for each of their wallets.
- A failed `pool` read is still a `200`, with `state: "error"`, its `code` and a sentence for a person, so read `state`. `pool_not_found` means the pool directory knows no pool for the token yet, `pool_unreadable` that none of its pools could be charted, or that the token's own price is refused (a honeypot's, or a cap its pool can't carry), and `upstream_failed` that the pool directory or the chain failed or ran out of time, or that the server had spent its directory requests for the minute: a read no socket shares, an HTTP poll's, has 10 of them a minute on each server, within the 50 a minute every server spends together, 20 of it left to open pages. Where the token page withholds the token's cap, or the holders' census would withhold the cap the pool's own price makes, the read is still `state: "ok"`, with `supply`, `marketCap`, `floorMcap` and `ceilMcap` null.
- An answer carries `X-Market-Revision`, the answering server's count of the view's changes, which another server, or the same one later, numbers afresh, so compare `ETag`s across answers, never revisions. `X-Market-Cursor` is the change notification its build started from, and `Age` the view's age in seconds. `x-market-stale: 1` means the last rebuild failed and you got the view built before it, which no cache may keep.
- A fresh answer carries a weak `ETag`, a digest of its bytes: send it back as `If-None-Match`, and any server holding the same bytes answers `304`. Some bodies carry the answering server's own clock or reads, such as `generatedAt` in a `token` body or `sources[].fetchedAt` in an `assets` one: no other server holds those bytes, so only the server that answered can answer `304`, and only until a rebuild changes them.
- No `Access-Control-Expose-Headers` names those headers, so a script on another origin reads the body but not them.
- An error comes in [the shorter envelope](https://traktor.fun/docs/errors.md#where-the-envelope-is-shorter), `code` and `message` alone. A price here is not an executable quote. To keep a view current, subscribe to it on [the market stream](https://traktor.fun/docs/market-stream.md) instead of polling.

### `GET /v1/public/search`

Tokens matching a ticker, a stock's company name or a contract address, at most 8 of them.

- URL: `https://api.traktor.fun/v1/public/search`
- Credential: None

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `q` | query | string | yes |  | up to 64 | A ticker, the start of a stock's company name, a contract address or mint, or the start of an EVM address. |

Limits:

- Searches: 60 a minute, per IP
- Token directory lookups: 10 a minute, per IP
- Searches building: 16 at once, per server process
- Reads with a sign-in, once enforced, every /v1/public/ route together: 1,000 a minute by default, per account

```bash cURL
curl -s "https://api.traktor.fun/v1/public/search?q=EXAMPLE"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/public/search?q=EXAMPLE");
const body = await response.json();
```

```python Python
import requests

response = requests.get(
    "https://api.traktor.fun/v1/public/search",
    params={"q": "EXAMPLE"},
)
print(response.json())
```

Response `200`:

```json
{
  "query": {
    "kind": "ticker",
    "text": "EXAMPLE"
  },
  "tokens": [
    {
      "chain": "bnb",
      "address": "0x2222222222222222222222222222222222222222",
      "ticker": "EXAMPLE",
      "name": "Example",
      "logoUrl": null,
      "marketCap": 4120000,
      "valuationSource": "pool",
      "marketPriceUpdatedAt": "2026-10-03T11:59:58.000Z",
      "marketPriceConfirmedAt": "2026-10-03T11:59:58.000Z",
      "valuationExpiresAt": "2026-10-03T12:04:58.000Z",
      "liquidity": 380120.5,
      "metadataAt": "2026-10-03T11:58:00.000Z",
      "lastTradeAt": "2026-10-03T12:00:00.000Z",
      "launchpad": "flap"
    }
  ],
  "external": null,
  "asOf": "2026-10-03T12:00:01.000Z"
}
```

Errors: `invalid_query`, `method_not_allowed`, `rate_limited`, `sign_in_required`, `sign_in_unavailable`, `data_unavailable`. Every code: https://traktor.fun/docs/errors.md

`q` is a full contract or Solana mint, which finds the token on every chain the index holds it on; `0x` and six or more hex digits, which finds the contracts that start with them; or a ticker or its start, in any case. A ticker also finds a tokenized stock by its underlying ticker in full (bCOIN by `COIN`), or, from three characters, by the start of that ticker or of the company's name (`tesla`, `coinbase glob`). A ticker or a contract's start leaves out a major, such as a stablecoin or a wrapped or bridged coin, and a token no launchpad we know made, save a stock an issuer verifies, while its full contract still finds either. That rule runs over a bounded read of the closest matches, so a ticker or a contract's start that many such tokens share can come back short. A token's own name is not searched, and a query with anything but one `q` is `400 invalid_query`. Each row dates its market cap as a board row does ([Fields and clocks](https://traktor.fun/docs/market.md#fields-and-clocks)), but its `metadataAt` is an ISO time where a board row's is Unix milliseconds. Its `launchpad` is the launchpad the index names for the token, as a board row's is, and `null` where it names none, never a guess.

Only a full contract or mint the index does not hold is asked of an outside token directory, and that answer comes back apart, under `external`, with no market cap: its `tokens` is empty when the directory did not know the address, and `null` when it could not be asked. An answer says in `Cache-Control` how long it may be shared, with an `ETag`, except one whose `external.tokens` is `null`, which is `no-store`. Each server builds its own answer, dated to the millisecond in `asOf`, and keeps it as long as it may be shared, so a `304` comes only from the server that answered, inside that window. `429 rate_limited` and `503 data_unavailable` carry `Retry-After`.
