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

# Tokens

One token's page under a key: its detail and its signals.

The token routes answer with the same views Traktor's token page reads, in the v1 envelope and drawn from your plan's units.

Each answer is the view the server last built for that token, shared with every other reader of it. `meta.asOf` dates that build, and an answer carrying `X-Market-Stale: 1` is the view kept through a rebuild that failed. `chain` and `address` are checked before the request is admitted, as is every query key a route takes: a chain or address the route cannot read, or a key it does not take, is a `400` with no `X-Traktor-Cost`.

### `GET /v1/tokens/{chain}/{address}`

One token's detail and candles, the token page's header and chart.

- URL: `https://api.traktor.fun/v1/tokens/{chain}/{address}`
- Credential: API key
- REST units: 5 units

| Parameter | In | Type | Required | Default | Bounds | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `chain` | path | enum | yes |  | solana, base, bnb, robinhood, arc, arbitrum, ethereum | The token's chain. |
| `address` | path | 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. |

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/tokens/base/0x4444444444444444444444444444444444444444" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/tokens/base/0x4444444444444444444444444444444444444444", {
  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/tokens/base/0x4444444444444444444444444444444444444444",
    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

### `GET /v1/tokens/{chain}/{address}/signals`

One token's signals, newest first.

- URL: `https://api.traktor.fun/v1/tokens/{chain}/{address}/signals`
- Credential: API key
- REST units: 2 units

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

Limits:

- Invalid keys: 30 a minute, per IP

```bash cURL
curl -s "https://api.traktor.fun/v1/tokens/base/0x4444444444444444444444444444444444444444/signals" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

```ts TypeScript
const response = await fetch("https://api.traktor.fun/v1/tokens/base/0x4444444444444444444444444444444444444444/signals", {
  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/tokens/base/0x4444444444444444444444444444444444444444/signals",
    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

The detail warns before a buy.

- `token.honeypot` is the reading that judged the token a honeypot, its day's distinct `buyers` and `sellers` and when (`at`): `false` once a reading judged it none, `null` where none has, as on every Solana token.
- `token.transferFeeBps` is a Solana mint's transfer fee in basis points, the rate it charges now or a higher one it has already scheduled, taken from every buy and sale up to the mint's cap on one transfer: `0` where the mint charges none, `null` until it is read and on every other chain.
- `token.tax` is an EVM token's own buy and sell tax, the share of a buy (`buyBps`) and of a sale (`sellBps`) its contract keeps in basis points, read by simulating a small buy and sale through its market pool, and when (`at`): a side the simulation could not read is `null`, never `0`, and the whole is `null` where no reading of the last six hours exists, on a token whose market pool is not a v2 pool in the chain's wrapped native, and on every Solana token. The simulated buyer and seller is a contract that sells straight after its buy, so where a token taxes contracts or a quick resale more, the reading is what that contract would pay.
- `token.safety` is what three outside token checkers last said of an EVM token, the `flags` they raised and when (`at`): `goplus_honeypot`, `goplus_airdrop_scam` and `goplus_fake_token` are the first checker's flags for a honeypot, an airdrop scam and a copy of another token, and `honeypot_is_simulation` is a sale the second checker's simulation could not make, asked only where the first raised none, on the chains the second serves. On the EVM chains it does not serve, the third is asked about a token viewed lately that the first raised none on, when Traktor has its budget: `serialized_audit_simulation` is a sale its simulation could not make, and `serialized_audit_sell_block` a contract it finds can stop a sale. An empty `flags` is a reading that raised none, served for a day; a reading that raised a flag is served until a newer one replaces it, however old, so `at` can be days back on a token nobody has traded or viewed since; the whole is `null` where no reading raised a flag and none answered in the last day, and on every Solana token.
- `token.goplus` is the first checker's reading of the token's contract, on every chain, and when it was read (`at`), served however old: `checks` holds each check it answered, `true` or `false`, a check it left out absent, never `false` (on the EVM chains `honeypot`, `cannotBuy`, `cannotSellAll`, `airdropScam`, `fakeToken`, `creatorHoneypots`, `pausable`, `blacklist`, `whitelist`, `cooldown`, `antiWhale`, `antiWhaleChangeable`, `taxChangeable`, `walletTax`, `mintable`, `balanceChangeable`, `hiddenOwner`, `reclaimOwner`, `selfDestruct`, `externalCall`, `proxy`, `closedSource` and `ownerRenounced`; on Solana `nonTransferable`, `freezable`, `taxChangeable`, `transferHook`, `hookChangeable`, `mintable`, `balanceChangeable`, `closable` and `metadataChangeable`; on both `trusted`, present only as `true`). A `true` is a risk but for `ownerRenounced` and `trusted`. `buyTax`, `sellTax`, `transferTax` and `creatorShare` are shares of 0 to 1, `lpLockedShare` the share of its pools' liquidity tokens held locked or burned and `holderCount` its count, each `null` where it gave none or, for `lpLockedShare`, did not say a holder's lock or a locked holder's share. The whole is `null` where that checker has not read the token or held no reading when asked.
- `token.security` is Traktor's own token checker's last scan, on every chain: a `verdict` (`benign`, `warning`, `malicious` or `spam`, `null` where too little was read to judge), a `score` from 0 to 1, each check it read under its feature id with a `finding` (`yes`, `no`, or `possible` for a power the code holds that no simulation proved), a `severity` and when it was read (`at`), the `fees` a simulated trade measured in basis points and the `limits` it read in whole tokens (`false` where the contract holds none). A check it did not read is absent, never `no`, and a verdict is `benign` only where a simulated sale went through or the token is on the trusted list. A scan that found harm, or in which a simulated sale failed or found the token unsellable whatever its verdict (a trusted token's among them), is served until the next one, however old; any other for a day; the whole is `null` where the token has not been scanned or its last clean scan is older. Its `fees` are served for six hours, as `token.tax` is, then `null` whatever the verdict.
- `token.codexRisk` is the market data provider's last risk read of the token, on every chain it reads, Solana's included: its `verdict` (`SCAM`, `HIGH_RISK`, `CAUTION`, `NEUTRAL`, `VERIFIED` or `VERIFIED_CONTESTED`, `null` where it sent none or one not listed here), the reason codes it cited (`reasons`, as it spells them, `PROOF_HONEYPOT_SIM` or `TAX_SELL_HIGH` for example, a code added later kept) and when Traktor stored it (`at`), served however old. `SCAM` rests on a proof or a reviewer's label and `HIGH_RISK` and `CAUTION` on the provider's score; `NEUTRAL` is not clean, as it can stand on a token the provider ran no sale check on. The whole is `null` where the provider has not read the token or sent no risk read, never a clean one.
- `token.quoteControls` is what the issuer of a Solana token's quote can do to it, where the token's market pool is quoted in a coin that is not SOL, USDC or USDT: the quote's `mint` and `symbol` (`null` where its own record names none), whether the mint can be paused (`pausable`) and is paused now (`paused`), a transfer fee its authority can change (`feeChangeable`) and the fee charged in basis points (`feeBps`, the rate in force or a higher one already scheduled, `null` where unread), a permanent delegate that can move or burn any holder's balance (`permanentDelegate`), and when the mint was read so (`at`). Traktor reads the quote's mint once a minute and writes the reading onto the tokens quoted in it that it watches, the active ones and up to 2,000 more of those traded in the last day, at least hourly; the detail serves it for three hours from that write while the market pool is still quoted in it. The whole is `null` where the quote grants none of these powers, where no write of the last three hours stands, and on every other chain; only the market pool's quote is read, so `null` says nothing of the token's other pools. A quote paused now, or keeping 10% or more of a transfer, holds a buy on the token page for the trader's word.

A token's signals carry the wallet behind each trade, and that wallet's year and win rate, as [the signal feed's](https://traktor.fun/docs/signals.md#the-wallet-behind-a-trade) do.

## Search

### `GET /v1/search`

The keyless token search's answer under a key: tokens matching a ticker, a stock's company name or a contract address, at most 8 of them.

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

| 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:

- Invalid keys: 30 a minute, per IP
- Token directory lookups on each server: 10 a minute, per account
- Searches building: 4 at once, per account

```bash cURL
curl -s "https://api.traktor.fun/v1/search?q=EXAMPLE" \
  -H "Authorization: Bearer $TRAKTOR_API_KEY"
```

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

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

It answers with what [`GET /v1/public/search`](https://traktor.fun/docs/public-market.md#get-v1-public-search) answers, the same rows from the same shared answers, in the v1 envelope and drawn from your plan's units instead of the keyless route's budget per IP. An exact address the index misses is asked of an outside token directory on your account's own allowance, at most 10 lookups a minute on each API server, inside the 30 a minute every reader of that server shares and the 30 of its 40 directory reads a minute that its open pages share with search, and within the 50 a minute every server spends together; past any of them, or when the lookup fails, `external.tokens` is `null` and the answer is kept by no cache. A `q` that is neither a ticker nor an address is `400 invalid_parameter`, refused before admission. An account holds at most 4 search builds at once of the pool the keyless route shares, so past that, or when every build is taken, the answer is `503 market_busy`, and its unit comes back.

## When a read fails

A view still being built, or one that failed with nothing kept, is `503 data_unavailable`, with `details.reason` `warming` or `unavailable`. A batch of trades still folding into the view is `503 market_fold_pending`, and market reads too busy to take another are `503 market_busy`. Each carries `Retry-After`, and its units come back: `X-Traktor-Cost: 0`.
