Mint-scoped trade tape (cursor-paginated raw trades)
Every captured trade for one token, newest first — the backfill complement to the live firehose (seed history, then keep current via the stream). Per trade: tx_signature, wallet_address, action, sol_amount, token_amount, price_sol/price_usd, market_price_sol/market_price_usd, early_buyer_rank, slot, block_time.
Two different prices, on purpose. price_sol is this trade's executed price — sol_amount / token_amount, so it reconciles exactly with the amounts on the same row and with the PnL endpoints. sol_amount is the wallet's net SOL movement, so that price is the trader's all-in effective rate: it includes the swap fee and any account rent paid in the same transaction, and it is not the pool mid. market_price_sol is our market-cap tracker's canonical pool price sampled near that trade's slot — one value per token per update, so every trade in the same slot shares it. Use price_sol for cost basis, fills and PnL; use market_price_sol when you want a per-token price series independent of trade size and direction.
Exact amounts (amounts, not yet enabled — appears on every row once exact amounts are switched on): sol_amount and token_amount keep their meaning (gross SOL movement incl. fee/rent; 6-decimal rounded UI amount). amounts adds the exact base-unit values as strings — see the TradeRawAmounts schema. Rows stored before exact amounts existed report raw_known: false with every field null (unknown, never 0).
Changed 2026-08-16: price_sol/price_usd previously carried the canonical value, which disagreed with the row's own amounts by a 7.9% median (and far more on fast-moving mints, where one slot can span a 60% price swing). The canonical number did not disappear — it moved to market_price_*.
Coverage honesty: capture starts 2026-04-12 and is pump.fun-pipeline scoped — the coverage response object carries both markers. Size floor: Buys under 0.05 SOL (under $3.50 when paid in USDC/USDT) are not stored; sells that receive SOL are kept at any size. (coverage.size_floor). Default window is full history. PRO+.
Where the rows come from (added 2026-08-29): closed months older than the newest three move from Postgres to a Parquet archive; pages are split at history.postgres_from (Unix seconds) — rows at/after it are served from Postgres, older rows from the archive reader — with the same ordering and cursor. history.archive_used says whether this page touched the archive (archive_months lists which), history.archive_available whether the archive could be reached (null = not configured), and history.truncated: true means older history was requested but the archive did not answer — retry later rather than treating has_more:false as the end of the tape. Response header X-Read-Source: core, core+archive or archive.
Request
- Base URL: https://madeonsol.com/api/v1
- URL: https://madeonsol.com/api/v1/tokens/{mint}/trades
- Auth: HTTP bearer
Path parameters
Solana token mint address
Query parameters
Opaque pagination cursor from next_cursor
Filter to one wallet's trades on this token
Unix seconds lower bound (default: full history)
Unix seconds upper bound (default: now)
Response
OK
Example response
{
"coverage": {
"history_start": 1775984757,
"scope": "pump.fun pipeline (pump.fun, LaunchLab/bonk, bags)",
"size_floor": {
"min_sol": 0.05,
"min_stable_usd": 3.5,
"applies_to": "buys and SOL-spending legs; SOL-receiving sells of any size are kept"
}
}
}Changes
No recorded changes to this operation across all 1 revision of this API.