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

# Stocks

The stock board and the stock registry under a key.

These routes answer with the same views Traktor's stock board reads, in the v1 envelope and drawn from your plan's units.

### `GET /v1/stocks`

The board's tokens that pair with a stock, grouped by the stock they pair with.

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

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chains` | query | list | no |  | solana, robinhood, bnb, base, arc, arbitrum, ethereum, monad, hyperevm, elysium | Chains to include; empty means all. |
| `platforms` | query | list | no |  | fomo, gmgn, pump, axiom, coinbase, padre, maestro, bloom, trojan, bonkbot, bankr, photon | Apps to include; empty means all. |
| `windowMinutes` | query | enum | no | 60 | 5, 15, 30, 60, 240, 1440 | The window, in minutes. |
| `dexSignals` | query | list | no |  | paid, boost, cto | DEX signals; a token with any of them matches. |
| `stockPairs` | query | list | no |  | up to 12 items | The stocks to show, by ticker, comma-separated; empty means every 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. |
| `rank` | query | enum | no | net | volume, net, mcap | How the stocks are ranked. |
| `stock` | query | string | no |  |  | One stock's group, as `ticker:<TICKER>` or `address:<chain>:<address>`, to page through its tokens. |
| `offset` | query | integer | no | 0 | from 0 | Tokens to skip inside the `stock` group. |

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/stocks?stockPairs=NVDA,TSLA&stock=ticker%3ANVDA" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/stocks?stockPairs=NVDA,TSLA&stock=ticker%3ANVDA", {
  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/stocks",
    params={"stockPairs": "NVDA,TSLA", "stock": "ticker:NVDA"},
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `route_not_found`, `data_unavailable`, `market_busy`, `market_fold_pending`, `window_out_of_range`, `screen_conflict`, `too_many_addresses`, `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/stocks/registry`

The issuers' official tokenized stocks, and where the list came from.

- URL: `https://api.traktor.fun/v1/stocks/registry`
- Credential: API key
- REST units: 1 unit

Limits:

- Invalid keys: 30 a minute, per IP

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

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/stocks/registry", {
  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/stocks/registry",
    headers={"Authorization": f"Bearer {os.environ['TRAKTOR_API_KEY']}"},
)
print(response.json())
```

Errors: `invalid_parameter`, `unknown_parameter`, `duplicate_query_parameter`, `route_not_found`, `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

Each answer is the view the server last built for that question, shared with every other reader of it, and `meta.asOf` dates that build. The board takes the names the [market](https://traktor.fun/docs/market.md) routes take, `chains`, `platforms`, `windowMinutes`, `dexSignals`, `stockPairs` and the screens, and reads them as the market filter does: a name it does not know is `400 invalid_parameter`, never dropped. `stockPairs` names the stocks to show, up to 12 at once. The board ranks the stocks by net flow unless `rank` says otherwise, and `stock` with `offset` pages through one stock's tokens. Every key is checked before the request is admitted: a key the route does not take, or a value its grammar refuses, is a `400` with no `X-Traktor-Cost`.

A view still being built, or one that failed with nothing kept, is `503 data_unavailable`, and its units come back, as on the [Tokens](https://traktor.fun/docs/tokens.md) page.
