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

# Market

The dashboard's numbers and the market filter that selects them.

`GET /v1/market` answers several views in one body, and each view is also a route of its own.

A read is answered from the view the public market holds for the same filter, views and page, the one the Board and the market socket read, so an answer can be a few seconds older than the request; `meta.asOf` says when it was built, and a view kept through a failed rebuild comes with `X-Market-Stale: 1`. A filter the public market would read differently (a screen between the steps it rounds to, `launchpads=other` without the families, a `minTradeUsd` of 0), a `tape` or `wallets` page over 120 rows, or a `rotation` page over 40 or with another `withinMinutes`, is built for the request instead. The exception is a `GET /v1/market/wallets` page of up to 500 rows over the whole market's day, the day's `windowMinutes` with no `chains`, `platforms`, `wallets`, screen, `launchpads`, `dexSignals` or `stockPairs`, and `feeSharing` left at `any`. Such a page can come from the day's ranking of its first 500 wallets, made at most once a minute and used only while under three minutes old, so it can be up to three minutes older than the request, and its `meta.asOf` says when it was ranked.

## Views and units

`GET /v1/meta/filters` publishes each view's units under `market.cost`. Naming `summary` in `views` costs nothing more, since `GET /v1/market` serves and charges it anyway. `whales` has only its own route, and takes no window and no screens.

### `GET /v1/market`

Several of the board's views over one market filter, built once.

- URL: `https://api.traktor.fun/v1/market`
- Credential: API key
- REST units: The sum of the views it serves; `summary` is always one of them.
- Also takes the market filter: https://traktor.fun/docs/market.md

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `views` | query | list | no | summary | summary, tokens, series, tape, rotation, wallets | Views to include; `summary` is always added. |
| `limit` | query | integer | no | 200 | 1–1,000 | Token rows, read only with `tokens`. |
| `offset` | query | integer | no | 0 | 0–50,000 | Token rows to skip, read only with `tokens`. |
| `sort` | query | enum | no | net | 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`. |
| `dir` | query | enum | no | desc | asc, desc | Ranking direction, read only with `tokens`. |
| `tail` | query | boolean | no | false |  | Includes both ends of the ranking, as the flow map draws net flow; the far end holds only rows that have the ranked figure. Cannot go with `offset`. |
| `named` | query | boolean | no | false |  | Keeps only tokens with a name. |
| `side` | query | enum | no | all | all, buy, sell | Trade side, read only with `tape`. |
| `minTradeUsd` | query | money | no |  | from 0 | The smallest trade in USD, read only with `tape`. |
| `minWalletBalanceUsd` | query | money | no |  |  | Keeps wallets holding at least this much, in USD; it must be above 0. Read only with `tape` or `rotation`. |

Limits:

- Invalid keys: 30 a minute, per IP
- Wallets a balance floor may select: 5,000 wallets, per request

```bash cURL
curl -s "https://api.traktor.fun/v1/market?views=summary,tokens&limit=1" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market?views=summary,tokens&limit=1", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market",
    params={"views": "summary,tokens", "limit": 1},
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": {
    "summary": {
      "buyUsd": 9412224.3,
      "sellUsd": 9000106.1,
      "netUsd": 412118.2,
      "volumeUsd": 18412330.4,
      "trades": 61204,
      "tokens": 182440,
      "wallets": 2310884,
      "lastTradeAt": "2026-10-03T12:00:00.000Z"
    },
    "tokens": [
      {
        "tokenAddress": "0x2222222222222222222222222222222222222222",
        "chain": "bnb",
        "platform": "fomo",
        "ticker": "EXAMPLE",
        "logoUrl": null,
        "buyUsd": 646119.5,
        "sellUsd": 557999.2,
        "netUsd": 88120.3,
        "volumeUsd": 1204118.7,
        "trades": 2412,
        "buyers": 1120,
        "sellers": 980,
        "priceUsd": 0.0033,
        "marketCap": 4120000,
        "marketPriceUpdatedAt": "2026-10-03T12:00:00.000Z",
        "valuationSource": "pool",
        "valuationExpiresAt": "2026-10-03T12:05:00.000Z",
        "marketPriceConfirmedAt": "2026-10-03T12:00:00.000Z",
        "priceChangePct": 12.4,
        "launchpad": null,
        "launchpadIcon": null,
        "graduated": null,
        "graduationPct": null,
        "pairTokenAddress": null,
        "pairTokenTicker": null,
        "holderRewards": null,
        "dexscreenerSocialsUpdated": null,
        "dexscreenerBoosted": null,
        "communityTakeover": null,
        "leaderboardHolders": [],
        "leaderboardHolderCount": 0,
        "topTradersBought": 41,
        "topTradersHolding": 17,
        "topTradersFlow": {
          "buyUsd": 61220.4,
          "sellUsd": 18904.1,
          "buyers": 23,
          "sellers": 9,
          "holding": 17,
          "unpriced": 2,
          "apps": [
            {
              "platform": "fomo",
              "buyUsd": 48110.2
            },
            {
              "platform": "axiom",
              "buyUsd": 13110.2
            }
          ]
        },
        "fomoHolders": 312,
        "holderCount": 4118,
        "heldUsd": 402118.2,
        "heldPct": 9.8,
        "fomoPnlUsd": 12220.4,
        "holderSpark": [
          298,
          305,
          312
        ],
        "athPrice": 0.0041,
        "xToAth": 1.24,
        "liquidity": 380120.5,
        "change15m": 1.2,
        "change1h": 4.8,
        "change4h": 9.9,
        "change24h": 12.4,
        "firstSeenAt": "2026-09-28T08:14:00.000Z",
        "launchedAt": "2026-09-28T08:11:00.000Z",
        "lastTradeAt": "2026-10-03T11:59:58.000Z",
        "metadataAt": 1791028680000,
        "gmgnAt": 1791028500000,
        "spark": [
          0,
          41220.6,
          88120.3
        ]
      }
    ]
  },
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:02.000Z",
    "caveats": [
      "provider_discovered_partial"
    ],
    "page": {
      "limit": 1,
      "offset": 0,
      "returned": 1,
      "total": 1412,
      "hasMore": true,
      "inflowUsd": 2841220.55,
      "outflowUsd": 2610904.12
    }
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `plan_forbids`, `filter_too_broad`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

## The market filter

The market filter is a grammar apart from the flow filter, read from the query string.

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `v` | query | integer | no |  | 1 | Grammar version; send 1, or leave it out. |
| `chains` | query | list | no |  | solana, robinhood, bnb, base, arc, arbitrum, ethereum, monad, hyperevm, elysium | Chains to include, comma-separated; empty means all. A name outside the vocabulary is refused. |
| `platforms` | query | list | no |  | fomo, gmgn, pump, axiom, coinbase, padre, maestro, bloom, trojan, bonkbot, bankr, photon | Apps to include, comma-separated; empty means all. A name outside the vocabulary is refused. |
| `wallets` | query | list | no |  | up to 100 items | Wallet addresses, EVM or Solana, to narrow every view to their own trades; left out means any, and an empty value selects no wallets. |
| `windowMinutes` | query | enum | no | 60 | 5, 15, 30, 60, 240, 1440 | The window the views summarise, in minutes. |
| `launchpads` | query | list | no |  |  | Launchpad families, as `market.launchpads` in `GET /v1/meta/filters` lists them, each optionally chain-qualified, like `bnb:flap`. |
| `dexSignals` | query | list | no |  | paid, boost, cto | DEX signals; a token with any of them matches. |
| `feeSharing` | query | enum | no | any | any, shared, not_shared | Whether the token's launchpad shares its fees. |
| `stockPairs` | query | list | no |  | up to 12 items | Stock tickers the token pairs with, or `ANY-STOCK` for any stock. |
| `minNet` | query | money | no |  |  | Net flow at least. A negative floor keeps outflow in view rather than screening it away. |
| `maxNet` | query | money | no |  |  | Net flow at most — set it negative to find only what is being distributed. |
| `minVolume` | query | money | no |  | from 0 | Traded volume at least, both sides together. |
| `minBuyers` | query | integer | no |  | from 0 | Distinct buying wallets at least — breadth, where volume is only size. |
| `minSellers` | query | integer | no |  | from 0 | Distinct selling wallets at least. |
| `minTrades` | query | integer | no |  | from 0 | Trades at least. |
| `minRatio` | query | number | no |  | from 0 | Dollars bought per dollar sold — 2 means twice as much buying as selling. |
| `minChange` | query | number | no |  |  | Price move across the window, at least. Negative finds what is falling. |
| `maxChange` | query | number | no |  |  | Price move across the window, at most. |
| `minTopTraders` | query | money | no |  | from 0 | What the top 10,000 traders by year profit bought in the window, at least. Counted over the Board's six windows alone: on any other window, or for a buy with nothing priced, a token is in no band. |
| `minMcap` | query | money | no |  | from 0 | Market cap at least. |
| `maxMcap` | query | money | no |  | from 0 | Market cap at most. Tokens with no cap yet are kept — a brand-new one is small by definition. |
| `minLiq` | query | money | no |  | from 0 | Pool depth at least — what the token can absorb before price moves. |
| `maxLiq` | query | money | no |  | from 0 | Pool depth at most. |
| `minLiqPct` | query | number | no |  | from 0 | Depth as a share of market cap — how much of the cap there is real money behind. |
| `minHolders` | query | integer | no |  | from 0 | Wallets holding the token on chain, at least, as its data provider last counted them; a token nobody counted is in no band. |
| `minFomoHolders` | query | integer | no |  | from 0 | Wallets on fomo still holding a position. |
| `minHeldPct` | query | number | no |  | from 0 | Share of circulating supply sitting in fomo wallets — how much of the token the crowd here owns. |
| `minAth` | query | number | no |  | from 0 | Multiple back to the all-time high, at least — headroom above the current price. |
| `maxAth` | query | number | no |  | from 0 | Multiple back to the high, at most — near its own top. |
| `maxAge` | query | string | no |  |  | 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. Takes hours above zero, or a duration such as `30m`, `4h` or `3d`. |
| `minAge` | query | string | no |  |  | 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. Takes hours above zero, or a duration such as `30m`, `4h` or `3d`. |
| `minCurve` | query | number | no |  | from 0 | Bonding-curve progress, at least, in percent; a token that has graduated counts as 101. |
| `maxCurve` | query | number | no |  | from 0 | Bonding-curve progress, at most, in percent; 100 keeps only tokens still on their curve. |

- A `windowMinutes` outside the windows listed is `400 window_out_of_range`, with the windows in `details.allowed`. `summary`, `tokens` and `series` read minute buckets and serve every window on every plan. `tape`, `rotation` and `wallets` read trades, so a window longer than the plan's history is `403 plan_forbids`, with `details.maxHistoryMinutes`, `details.given` and the `details.views` that read trades.
- A name outside the vocabulary in `chains` or `platforms` is `400 invalid_parameter`, with `details.parameter` and `details.value`. Neither has a singular spelling here: `chain` is `400 unknown_parameter`.
- A query parameter given twice, a filter key or a route key such as `limit`, is `400 duplicate_query_parameter`, refused before any key is read.
- A route refuses by name a key it does not read: `400 unknown_parameter`, with `details.parameter`, `details.route` and `details.accepts`, the keys it reads. `GET /v1/market` reads the keys of the views it serves, so a token board key (`limit`, `offset`, `sort`, `dir`, `tail` or `named`) sent without `views=tokens` is `unknown_parameter` too, with `details.requires`.
- A floor above its own ceiling, such as `minMcap` over `maxMcap`, is `400 screen_conflict`.
- Beside the families `market.launchpads` lists, `launchpads` takes `other` for a launchpad outside them and `unknown` for a token with none. No view lists a token with none unless it is a stock an issuer verifies, so `unknown` selects only those, and no view lists a major, such as a stablecoin or a wrapped or bridged coin, whatever its tag; `tape` and `rotation` drop the other trades and pairs after reading their page, so a page can come back short. A member that names a chain, as `bnb:flap`, applies on that chain alone and replaces the members without one there; every other chain reads those. Send only members that name a chain and every other chain matches nothing.
- In `stockPairs`, `NVDA` matches a token quoted in any issuer's verified NVDA contract, or in a quote token whose own symbol is `NVDA`. `ANY-STOCK` matches only a quote contract an issuer has verified on that chain; a stock-like symbol alone never qualifies for it. `GET /v1/meta/filters` lists the issuer registries behind the verified contracts under `market.coverage.stockRegistrySources`, each with its own `status`, so one registry's outage reads as partial coverage, not as missing stocks.
- `dexSignals` keeps a token carrying any of the signals it names: `paid`, a paid DEX profile and social update; `boost`, DEX boost spend; `cto`, a reported community takeover. `GET /v1/meta/filters` lists them with their labels under `market.dexSignals`.
- A money key takes exact dollars: `300` is $300, and `k`, `m` or `b` scales it.
- A screen leaves out a token whose value it reads was never measured, and only a `maxMcap` sent without a `minMcap` keeps one: a token with no market cap yet is small. A token row's `liquidity` of `null` is unread, so `minLiq`, `maxLiq` and `minLiqPct` drop it, and `minLiqPct`, liquidity as a percent of the market cap, also drops a token with no market cap or with either at zero. `minAth` and `maxAth` screen the multiple from the price back to the token's recorded high before the rounding a token row's `xToAth` shows, except that a token at or above its high counts as 1 or less where `xToAth` is `null`; a token with no recorded high or no price, or either at zero, is in no band.
- `minWalletBalanceUsd` is resolved to a set of wallets before any view runs, and a floor that selects more wallets than the limit on the view's block is `422 filter_too_broad`, with `details.limit`, `details.parameter` and, when the refusal counted them, `details.matched`: raise the floor.

## Pages and meta

The token board is the only paged view, on `GET /v1/market/tokens` and on `GET /v1/market` with `views=tokens`. It ranks by net flow, the most bought first, unless `sort` and `dir` say otherwise. Its `meta.page` holds `limit`, `offset`, `returned`, `total` and `hasMore`, and two totals over every token the ranking took in, not the page alone: `inflowUsd`, the net flow into the tokens that took money in, and `outflowUsd`, out of those that lost it. The Board's flow map is `sort=net&tail=1`: the `limit` largest inflows and the `limit` largest outflows, with those two totals, which size its two panes. The far end of a `tail=1` read holds only rows that have the figure it ranks by, so where fewer rows have it the answer is shorter than twice the `limit`. Each page is read from its own view of the board, so a row can move between one page and the next; the largest `limit` takes the most rows from one ranking. A flag takes `0`, `1`, `true` or `false`, `tail=1` goes with an `offset` of zero only, and `GET /v1/meta/filters` lists the sort keys under `market.ranking`.

The views that read trades add `meta.retention`. Every view's `meta.caveats` qualify the chains and apps its filter selects, `whales` taking its chains alone, and a `minTradeUsd` adds `usd_amount_nullable`. Two look wider: `coverage_unread` whatever the filter selects, and `data_stale` for a stale pair on the filter's chains, whatever its app. Each is listed in [Caveats](https://traktor.fun/docs/trades.md#caveats). Coinbase Wallet's and Bankr's trades are read with known gaps, so a filter that takes in either app on a chain where it is tracked, as the default filter does, answers with `provider_discovered_partial`, and that pair's `coverageNote` in `GET /v1/alert-capabilities` says what is missed. Inside `summary`, the `tokens` and `wallets` counts take in every token and wallet the index knows, and `lastTradeAt` is the latest block time in the whole index, whatever the filter selects; every other figure there is the filter's. Those three are read at most a second before the build while the database answers within a tenth of a second, and up to thirty seconds before it while it is slower, so `lastTradeAt` can trail the newest trade by that much.

## Fields and clocks

- `meta.asOf` dates the body: when its view was built, or, where a day's `rotation` or `wallets` come from the board the server keeps of them, the older of the two.
- A token row dates its enrichment apart from `meta.asOf`, in Unix milliseconds: `metadataAt` and `gmgnAt` for its two data providers' last answers. Its `launchedAt` is an ISO time, when the token was created on chain by one data provider's record, else another's, and `null` where neither dated it; `firstSeenAt` is its first trade on our tape, and `minAge` and `maxAge` count from the earlier of the two.
- `minCurve` and `maxCurve` screen the bonding curve's progress in percent, a graduated token counting as 101: `maxCurve=100` keeps tokens still on their curve, `minCurve=101` graduated ones, and a token whose progress nobody measured is in no band.
- A token row's `lastTradeAt` is an ISO time, the newest trade we recorded for the token, by any app we track whatever `platforms` selects or as a verified swap on a pool we capture, as of the row's build, and `null` where we have recorded none.
- `liquidity` is the USD the market pool itself holds, read on chain while the token trades or is viewed, and `null` where no on-chain reader covers the market.
- A token row's `holderCount` is every wallet holding the token on chain, as one data provider last counted them, else another's last count, the number the token page's header shows, and `null` where neither counted; `sort=holders` ranks by it, and `minHolders` keeps tokens whose `holderCount` is at least that many, a token neither provider counted in no band.
- A token row's `fomoHolders`, `heldUsd` and `heldPct`, and a tape row's `fomoHolders`, measure the fomo wallets Traktor indexes, and are `null`, not zero, in a view whose `platforms` leave fomo out. `heldPct` is those wallets' observed positions as a share of the token's whole supply, a data provider's total where the stored supply is a provider's float, and is also `null` where that supply is unknown or the share would pass 100%.
- In `tokens`, and in `GET /v1/stocks`, a token row's `topTradersBought` counts the top 10,000 traders by realized year who bought the token on our tape over the last day, and `topTradersHolding` those of them whose last trade of it was a buy, whatever the window; both are `null` while unmeasured. Beside them, `topTradersFlow` is what those traders did in the token over the request's window: `buyUsd` and `sellUsd` (what was priced; `null` for a side they traded with nothing priced), `buyers` and `sellers`, `holding` (the window's buyers whose last trade of it was a buy), `unpriced` (their trades with no price, either way; above zero, a side summed beside it may be partly priced), and `apps`, their priced buys app by app, the most first, through every app whatever `platforms` selects. It is `null` while unmeasured; a token none of them traded in the window carries zeros and no apps.
- `minTopTraders` keeps tokens whose `topTradersFlow.buyUsd` is at least that many dollars: a token none of the top traders bought passes `minTopTraders=0` and no higher, and one whose flow is `null` or whose buys carried no price is in no band. Until the server holds the top traders' count, as for a while after it starts, a read with `minTopTraders` is `503 data_unavailable`, as a view still warming up is.

`valuationSource` says where a row's price and market cap come from: `pool` for a price observed on chain, `swap` for the token's last measured swap on its market pool, shown until a later pool reading replaces it and so with no `valuationExpiresAt`, `held` for our own pool reading observed after that swap and shown past its freshness, with no `valuationExpiresAt` (the token's quote and detail date it by `marketPriceObservedAt`; a row's `marketPriceUpdatedAt` still moves with its quote's dollar rate, so it understates the reading's age), or `null` for none. `dexscreener`, `gmgn` and `codex` remain in the schema but no longer appear: no provider's quote prices a token. `marketPriceUpdatedAt` dates the valuation's input, `marketPriceConfirmedAt` the confirmed chain head a pool price was read at, `null` for an unconfirmed observation, and `valuationExpiresAt` when the valuation stops being served. `GET /v1/meta/filters` classes each field under `market.provenance` and lists every source a field can come from under `market.provenanceSources`.

Every minute of the window has a `series` point, at zero when nothing traded. A chain where no app of ours is captured, today `elysium`, reads `null` in every point, never `0`: until 2026-11-08 every chain field was a number, so a client that sums them treats `null` as unmeasured. Its `minute` counts minutes since the Unix epoch, and the chain fields and the `platforms` fields each sum to the minute's net flow as the apps routed it: a Solana token row's `netUsd` also takes out its `exitUsd`, which the series does not, so the series over the window can sum to more than the tokens' net.

## When a read fails

Three refusals mean the read could not run at that moment, and each is worth retrying:

- `503 data_unavailable`: the data behind the view is still warming up or failed to build; `details.reason` says which. Retry after `Retry-After`.
- `503 market_busy`: the server is already holding as many reads waiting on a build, or running as many builds for requests of their own, as it allows. A request identical to one in flight joins it instead. Retry shortly.
- `503 market_fold_pending`: a committed batch of trades is still being folded into the view. Retry shortly, backing off if it persists.

Every refusal of the query, from a repeated key to `plan_forbids`, comes before admission and carries no `X-Traktor-Cost`. One raised once the read has started, `filter_too_broad` or the three above, gives its units back: `X-Traktor-Cost: 0` ([Limit headers](https://traktor.fun/docs/plans.md#limit-headers)).

## The views

### `GET /v1/market/summary`

The window's buys, sells, net flow, volume and trades, with how many tokens and wallets the index knows and the newest trade. A side whose every trade went unpriced is `null`, as is the net beside it, and the volume when nothing was priced. On Solana the net also takes out the direct exits its `tokens` rows take out, the ones a row's `exitUsd` names; under `wallets`, or where those were not read, it is buys less sells.

- URL: `https://api.traktor.fun/v1/market/summary`
- Credential: API key
- REST units: 1 unit
- Also takes the market filter: https://traktor.fun/docs/market.md

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/market/summary" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/summary", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/summary",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": {
    "buyUsd": 9412224.3,
    "sellUsd": 9000106.1,
    "netUsd": 412118.2,
    "volumeUsd": 18412330.4,
    "trades": 61204,
    "tokens": 182440,
    "wallets": 2310884,
    "lastTradeAt": "2026-10-03T12:00:00.000Z"
  },
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:02.000Z",
    "caveats": [
      "provider_discovered_partial"
    ]
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/tokens`

The board's token rows, ranked and paged by offset. A row's `buyUsd` or `sellUsd` is `null` where that side traded and none of its trades was priced, its `netUsd` beside it, and its `volumeUsd` where no trade was; such a figure ranks last either way and clears no screen. Beside a `null` `netUsd` the row's `spark` is empty. A Solana row's `netUsd` and `spark` also take out `exitUsd`, what the apps' own buyers sold on no app's route in the window: `null` where those were not read and under `wallets`, whose rows take none out, and absent on other chains. A token whose fee sharing sends every creator fee to OTC desks' rewards wallet adds `otcDesk: true`; the field is absent otherwise.

- URL: `https://api.traktor.fun/v1/market/tokens`
- Credential: API key
- REST units: 3 units
- Also takes the market filter: https://traktor.fun/docs/market.md

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `limit` | query | integer | no | 200 | 1–1,000 | Rows to return. |
| `offset` | query | integer | no | 0 | 0–50,000 | Rows to skip. |
| `sort` | query | enum | no | net | 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 | The ranking. |
| `dir` | query | enum | no | desc | asc, desc | Ranking direction. |
| `tail` | query | boolean | no | false |  | Includes both ends of the ranking, as the flow map draws net flow; the far end holds only rows that have the ranked figure. Cannot go with `offset`. |
| `named` | query | boolean | no | false |  | Keeps only tokens with a name. |

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/market/tokens?limit=1" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/tokens?limit=1", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/tokens",
    params={"limit": 1},
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "tokenAddress": "0x2222222222222222222222222222222222222222",
      "chain": "bnb",
      "platform": "fomo",
      "ticker": "EXAMPLE",
      "logoUrl": null,
      "buyUsd": 646119.5,
      "sellUsd": 557999.2,
      "netUsd": 88120.3,
      "volumeUsd": 1204118.7,
      "trades": 2412,
      "buyers": 1120,
      "sellers": 980,
      "priceUsd": 0.0033,
      "marketCap": 4120000,
      "marketPriceUpdatedAt": "2026-10-03T12:00:00.000Z",
      "valuationSource": "pool",
      "valuationExpiresAt": "2026-10-03T12:05:00.000Z",
      "marketPriceConfirmedAt": "2026-10-03T12:00:00.000Z",
      "priceChangePct": 12.4,
      "launchpad": null,
      "launchpadIcon": null,
      "graduated": null,
      "graduationPct": null,
      "pairTokenAddress": null,
      "pairTokenTicker": null,
      "holderRewards": null,
      "dexscreenerSocialsUpdated": null,
      "dexscreenerBoosted": null,
      "communityTakeover": null,
      "leaderboardHolders": [],
      "leaderboardHolderCount": 0,
      "topTradersBought": 41,
      "topTradersHolding": 17,
      "topTradersFlow": {
        "buyUsd": 61220.4,
        "sellUsd": 18904.1,
        "buyers": 23,
        "sellers": 9,
        "holding": 17,
        "unpriced": 2,
        "apps": [
          {
            "platform": "fomo",
            "buyUsd": 48110.2
          },
          {
            "platform": "axiom",
            "buyUsd": 13110.2
          }
        ]
      },
      "fomoHolders": 312,
      "holderCount": 4118,
      "heldUsd": 402118.2,
      "heldPct": 9.8,
      "fomoPnlUsd": 12220.4,
      "holderSpark": [
        298,
        305,
        312
      ],
      "athPrice": 0.0041,
      "xToAth": 1.24,
      "liquidity": 380120.5,
      "change15m": 1.2,
      "change1h": 4.8,
      "change4h": 9.9,
      "change24h": 12.4,
      "firstSeenAt": "2026-09-28T08:14:00.000Z",
      "launchedAt": "2026-09-28T08:11:00.000Z",
      "lastTradeAt": "2026-10-03T11:59:58.000Z",
      "metadataAt": 1791028680000,
      "gmgnAt": 1791028500000,
      "spark": [
        0,
        41220.6,
        88120.3
      ]
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:02.000Z",
    "caveats": [
      "provider_discovered_partial"
    ],
    "page": {
      "limit": 1,
      "offset": 0,
      "returned": 1,
      "total": 1412,
      "hasMore": true,
      "inflowUsd": 2841220.55,
      "outflowUsd": 2610904.12
    }
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/series`

Net flow per minute across the window: `minute`, a field per chain, `volume`, `unpricedBuys` and `unpricedSells`, the trades each side that carried no dollar figure and so are left out of the minute's dollars (a floor), and `platforms` with a field per app. A chain where no app of ours is captured reads `null`, never `0`.

- URL: `https://api.traktor.fun/v1/market/series`
- Credential: API key
- REST units: 2 units
- Also takes the market filter: https://traktor.fun/docs/market.md

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/market/series" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/series", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/series",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "minute": 29850479,
      "solana": 0,
      "robinhood": 1204.2,
      "bnb": 41220.1,
      "base": 18002.4,
      "arc": 0,
      "arbitrum": 0,
      "ethereum": 0,
      "monad": 0,
      "hyperevm": 0,
      "elysium": null,
      "volume": 412330.4,
      "unpricedBuys": 2,
      "unpricedSells": 0,
      "platforms": {
        "fomo": 30118.9,
        "gmgn": 22480.4,
        "pump": 0,
        "axiom": 6623.2,
        "coinbase": 1204.2,
        "padre": 0,
        "maestro": 0,
        "bloom": 0,
        "trojan": 0,
        "bonkbot": 0,
        "bankr": 0,
        "photon": 0
      }
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:02.000Z",
    "caveats": [
      "provider_discovered_partial"
    ]
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/tape`

The window's newest trades, each with its token's ticker, the market cap now and at the trade, its token's net flow over the window, every wallet's even under `wallets`, and the app that routed it; a named wallet adds who it is and, where it was measured, its realized profit over the last year with that year's win rate, and a marked one its KOL or smart-money `marks`. A trade in a token whose fee sharing sends every creator fee to OTC desks' rewards wallet adds `otcDesk: true`; the field is absent otherwise.

- URL: `https://api.traktor.fun/v1/market/tape`
- Credential: API key
- REST units: 2 units
- Also takes the market filter: https://traktor.fun/docs/market.md

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `side` | query | enum | no | all | all, buy, sell | Trade side. |
| `minTradeUsd` | query | money | no |  | from 0 | The smallest trade in USD. |
| `minWalletBalanceUsd` | query | money | no |  |  | Keeps wallets holding at least this much, in USD; it must be above 0. |
| `limit` | query | integer | no | 120 | 1–500 | Rows to return. |

Limits:

- Invalid keys: 30 a minute, per IP
- Wallets a balance floor may select: 5,000 wallets, per request

```bash cURL
curl -s "https://api.traktor.fun/v1/market/tape" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/tape", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/tape",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "id": "bnb:0x7f3a9c1e5d2b4a6f8e0c1d3b5a7f9e2c4d6b8a0f1e3c5d7b9a2f4e6c8d0b1a3c:0",
      "chain": "bnb",
      "platform": "fomo",
      "ts": "2026-10-03T12:00:00.000Z",
      "wallet": "0x1111111111111111111111111111111111111111",
      "tokenAddress": "0x2222222222222222222222222222222222222222",
      "ticker": "EXAMPLE",
      "logoUrl": null,
      "side": "buy",
      "usdAmount": 412.5,
      "tokenAmount": 125000,
      "marketCap": 4120000,
      "marketCapAtTrade": 4120000,
      "fomoHolders": 312,
      "netUsd": 88120.3,
      "launchpad": null,
      "launchpadIcon": null,
      "pairTokenAddress": null,
      "pairTokenTicker": null,
      "holderRewards": null,
      "dexscreenerSocialsUpdated": null,
      "dexscreenerBoosted": null,
      "communityTakeover": null,
      "handle": "example",
      "displayName": "Example",
      "avatarUrl": "https://example.com/avatars/example.png",
      "x": "example_x",
      "realizedYearUsd": 48210.6,
      "winRateYear": 0.58,
      "marks": [
        "kol"
      ]
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:04.210Z",
    "caveats": [
      "provider_discovered_partial"
    ],
    "retention": {
      "horizonHours": 24,
      "floorAt": "2026-10-02T12:00:04.210Z",
      "truncated": false
    }
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `plan_forbids`, `filter_too_broad`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/rotation`

Which tokens wallets sold to buy which, summed from the sell-then-buy links the indexer pairs at capture.

- URL: `https://api.traktor.fun/v1/market/rotation`
- Credential: API key
- REST units: 5 units
- Also takes the market filter: https://traktor.fun/docs/market.md

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `minWalletBalanceUsd` | query | money | no |  |  | Keeps wallets holding at least this much, in USD; it must be above 0. |
| `limit` | query | integer | no | 40 | 1–200 | Rows to return. |
| `withinMinutes` | query | integer | no | 30 | 1–240 | How soon after a sell the next buy must land. |

Limits:

- Invalid keys: 30 a minute, per IP
- Wallets a balance floor may select: 5,000 wallets, per request

```bash cURL
curl -s "https://api.traktor.fun/v1/market/rotation" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/rotation", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/rotation",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "platform": "fomo",
      "from": "0x2222222222222222222222222222222222222222",
      "fromTicker": "EXAMPLE",
      "to": "0x3333333333333333333333333333333333333333",
      "toTicker": "OTHER",
      "usd": 61220.4,
      "wallets": 14,
      "chain": "bnb"
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:04.210Z",
    "caveats": [
      "provider_discovered_partial"
    ],
    "retention": {
      "horizonHours": 24,
      "floorAt": "2026-10-02T12:00:04.210Z",
      "truncated": false
    }
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `plan_forbids`, `filter_too_broad`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/wallets`

The wallet board: each wallet's buys, sells, net flow and trades in the window, its name and KOL or smart-money `marks` where a source knows them, and an imported outside opinion where one knows the wallet.

- URL: `https://api.traktor.fun/v1/market/wallets`
- Credential: API key
- REST units: 3 units
- Also takes the market filter: https://traktor.fun/docs/market.md

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `limit` | query | integer | no | 120 | 1–500 | Rows to return. |

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/market/wallets" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/wallets", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/wallets",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "wallet": "0x1111111111111111111111111111111111111111",
      "handle": "example",
      "avatarUrl": "https://example.com/avatars/example.png",
      "balanceUsd": null,
      "buyUsd": 120400.2,
      "sellUsd": 98002.7,
      "netUsd": 22397.5,
      "volumeUsd": 218402.9,
      "trades": 61,
      "tokens": 9,
      "lastTradeAt": "2026-10-03T11:58:12.000Z",
      "cieloPnl30dUsd": null,
      "cieloRoi30dPct": null,
      "cieloWinratePct": null,
      "marks": [
        "kol"
      ]
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:04.210Z",
    "caveats": [
      "provider_discovered_partial"
    ],
    "retention": {
      "horizonHours": 24,
      "floorAt": "2026-10-02T12:00:04.210Z",
      "truncated": false
    }
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `filter_version_unsupported`, `data_unavailable`, `market_busy`, `market_fold_pending`, `plan_forbids`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md

### `GET /v1/market/whales`

Wallets holding at least a balance floor, by holdings rather than by window. `meta.asOf` is when the positions were read, which can be up to five minutes before the request.

- URL: `https://api.traktor.fun/v1/market/whales`
- Credential: API key
- REST units: 3 units

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `v` | query | integer | no |  | 1 | Grammar version; send 1, or leave it out. |
| `chains` | query | list | no |  | solana, robinhood, bnb, base, arc, arbitrum, ethereum, monad, hyperevm, elysium | Chains to include, comma-separated; empty means all. |
| `minWalletBalanceUsd` | query | money | yes |  |  | Keeps wallets holding at least this much, in USD; it must be above 0. |
| `limit` | query | integer | no | 120 | 1–500 | Rows to return. |

Limits:

- Invalid keys: 30 a minute, per IP
- Wallets a balance floor may select: 5,000 wallets, per request

```bash cURL
curl -s "https://api.traktor.fun/v1/market/whales?minWalletBalanceUsd=50k" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/market/whales?minWalletBalanceUsd=50k", {
  headers: { Authorization: `Bearer ${process.env.TRAKTOR_API_KEY}` },
});
const body = await response.json();
```

```python Python
import os
import requests

response = requests.get(
    "https://api.traktor.fun/v1/market/whales",
    params={"minWalletBalanceUsd": "50k"},
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Response `200`:

```json
{
  "data": [
    {
      "wallet": "0x1111111111111111111111111111111111111111",
      "chain": "bnb",
      "balanceUsd": 1204330.1,
      "tokens": 3,
      "top": [
        {
          "ticker": "EXAMPLE",
          "tokenAddress": "0x2222222222222222222222222222222222222222",
          "usd": 802118.4
        }
      ],
      "lastTradeAt": "2026-10-03T11:40:00.000Z"
    }
  ],
  "meta": {
    "requestId": "req_01m40t5ek8b3x7r2mh5q",
    "generatedAt": "2026-10-03T12:00:04.210Z",
    "asOf": "2026-10-03T12:00:04.210Z",
    "caveats": [
      "provider_discovered_partial"
    ]
  }
}
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `limit_out_of_range`, `filter_version_unsupported`, `filter_too_broad`, `missing_credentials`, `invalid_key`, `key_revoked`, `subscription_inactive`, `key_in_query`, `method_not_allowed`, `rate_limited`, `quota_exhausted`, `rate_limit_unavailable`, `internal_error`. Every code: https://traktor.fun/docs/errors.md
