Tokens

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.

get/tokens/{mint}/trades

Request

  • Base URL: https://madeonsol.com/api/v1
  • URL: https://madeonsol.com/api/v1/tokens/{mint}/trades
  • Auth: HTTP bearer

Path parameters

mintstring required
Example:FfuWjhMm5LP3anZ5zq8SG4iqzYVvhM4LoyNMM957pump

Solana token mint address

Query parameters

limitinteger
cursorstring

Opaque pagination cursor from next_cursor

action'buy' | 'sell'
walletstring

Filter to one wallet's trades on this token

sinceinteger

Unix seconds lower bound (default: full history)

untilinteger

Unix seconds upper bound (default: now)

Response

OK

mintstring
next_cursorstring nullable
has_moreboolean

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.