Skip to Content
TerminalToken Detail

Token Detail Endpoints

These 25 endpoints go deep on a single Solana token: its snapshot and metadata, swaps, OHLCV candles and price ticks, holders and smart money, pump.fun launch bundles and launch race, insider funding clusters, token transfers, and risk signals such as the Raiden Trust score and wash trading. To fetch nine of them in one request, use the full token dossier.

Paths are relative to https://terminal.raiden.wtf/api and every request carries your key in the X-API-Key header (see Authentication). Each call costs the credits shown next to it.

Overview & metadata

The token snapshot, its off-chain metadata and its image.

Token snapshot

GET/tokens/{mint}1 credit

Returns the full snapshot of a single token: identity, bonding curve, status, last price and quote, the validator that produced its creation slot, and its off-chain metadata.

ParameterInDescription
mintpathToken mint address.
  • created_leader — the validator that produced the creation slot: identity, name, client, version, jito, stake, plus its geo region (country ISO code and city). Best-effort: only for epochs with a snapshotted leader schedule, and geo only for geo-resolved validators. Absent otherwise.
  • metadata — the token’s off-chain metadata (image, socials, description) as stored by the server: the same fields /tokens/{mint}/meta returns. Absent until the token URI has been fetched, normally within seconds of creation.

This request never fetches the metadata itself: it only returns what the server has already stored.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "creator": "5Q5q…Funr", "name": "Quantum Mascot", "symbol": "QMASC", "uri": "https://ipfs.io/ipfs/QmZ9xq…pump/metadata.json", "decimals": 6, "bonding_curve": "Cb3f…g9rE", "created_at": "2026-06-21T09:41:14Z", "created_slot": 348812907, "created_leader": { "identity": "Jee7…xQ2", "name": "Laine", "client": "agave", "version": "2.1.11", "jito": true, "stake": "1875432000000000", "country": "DE", "city": "Frankfurt am Main" }, "status": "graduated", "graduated_at": "2026-06-21T14:08:52Z", "amm_pool": "Gm4w…9xZ2", "last_price": "0.00000042", "last_trade_at": "2026-06-27T08:15:33Z", "quote_mint": "EPjF…USDC", "last_quote_price": "0.00006318", "quote_symbol": "USDC", "quote_decimals": 6, "mayhem": true, "metadata": { "image": "https://ipfs.io/ipfs/QmZ9xq…pump/image.png", "twitter": "https://x.com/quantummascot", "website": "https://quantummascot.fun", "telegram": "https://t.me/quantummascot", "description": "The quantum mascot of the pump.fun multiverse." } }

Token metadata

GET/tokens/{mint}/meta12 credits

Returns the off-chain metadata from the token URI: image, socials and description.

ParameterInDescription
mintpathToken mint address.

How it’s served. Answers come from the server’s metadata store. Each token’s metadata JSON is fetched once in the background (new tokens within seconds of creation) and kept, so the answer normally comes from storage in milliseconds.

Not stored yet. The server tries to fetch the metadata for up to about 1.5 s. If it still has no answer, it returns the same object with only "pending": true and Cache-Control: no-store. pending is also returned while a failed fetch waits for its next retry.

Final answers. Without pending the answer is final:

  • Fields the metadata does not set are omitted.
  • {} means there is none: no URI, a URI that cannot be fetched, or metadata deleted by its host.
  • A value that is not a Solana address answers {} at once.

Unknown mints. A mint we do not know answers pending for 2 minutes from the first time it is requested, since a token seconds old may not be indexed yet. After that it answers {}, kept about 5 minutes.

image is the canonical image URL (IPFS images on ipfs.io). Use /tokens/{mint}/image for a gateway that serves it.

A pending answer is not final: ask again a few seconds later. The fetch goes on server-side.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/meta" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "image": "https://ipfs.io/ipfs/QmZ9xPq7vYfK3nT8sLcW2mUaBdEfGhJkRtNpQrSvWxYz12", "twitter": "https://x.com/raiden_token", "website": "https://raiden.wtf", "telegram": "https://t.me/raiden_token", "description": "Raiden community token launched on pump.fun." }

Token image

GET/tokens/{mint}/image1 credit

Redirects (302) to the token image, for use in an <img src>. No response body is needed: follow the Location.

ParameterInDescription
mintpathToken mint address.

Redirects. For IPFS images, the Location is a gateway the server has checked actually serves that image. When no gateway confirms it in time, the Location is the first gateway that has not refused the image, and the redirect is kept only 90 s. A redirect is cacheable for at most 1 hour.

Not found. A 404 carries one of these cache headers:

ResponseMeaningCache
404 with max-ageNo image, or not a Solana address. Final.1 hour
404 with max-ageThe metadata is waiting for a retry.90 s
404 with max-ageThe token has no URI, or the mint has been unknown for over 2 minutes since it was first requested.5 minutes
404 with Cache-Control: no-storeThe answer is not known yet: same ~1.5 s budget as /meta, or a mint first requested less than 2 minutes ago that is not indexed yet. Request it again later.no-store
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/image" \ -H "X-API-Key: $RAIDEN_KEY"

Prices & trades

Raw swaps, OHLCV candles, per-swap price ticks and the trading activity strip.

Token swaps

GET/tokens/{mint}/swaps3 credits

Lists the token’s swaps with amounts, fees, reserves, compute budget, tip, router and bundle flag. You can interleave reverted attempts and wallet-to-wallet token sends in the same feed.

ParameterInDescription
mintpathToken mint address.
orderquerydesc or asc.
cursorqueryBoundary time.
limitqueryNumber of rows to return.
failedquery1 interleaves reverted attempts; their rows carry "failed": true.
transfersquery1 interleaves token sends; their rows carry "transfer": true.

Large numbers are strings.

Token sends (transfers=1). Sends are wallet-to-wallet movements of this token that are not trades at all. They matter because a wallet can leave the holder list without ever selling, and buying then fanning out to many wallets is the shape of a bundle.

  • Send rows carry the sender in trader, the receiver in to and a token_amount, but no price and no sol_amount: they never went through the market, and zeroing those fields would read as “sold for nothing”.
  • "ambiguous": true means the transaction had several senders and several receivers, so balance deltas cannot say who sent to whom: the pair shown is one of the possible ones, not a certainty.
  • Sends are derived from token balance deltas, so CPI moves are caught too. Transactions that touch pump.fun or PumpSwap are excluded, because those are trades, not sends.

Router.

  • router — the top-level program that orchestrated the swap: a custom smart contract, bot or aggregator (Trojan, BullX, Photon, GMGN, …). Absent means a direct call to pump.fun / pump-amm. Not retroactive: only swaps after 2026-07-06 carry it.
  • router_name — set when that program belongs to a known trading platform (Axiom, GMGN, Trojan, Photon, Padre, Bloom, Banana Gun, Maestro, BonkBot). It is resolved at read time, so it applies to the whole history. Absent for programs outside the registry.

Compute budget. priority_fee is in lamports, cu_price in micro-lamports per compute unit and cu_limit is the requested compute units. budget_source says where those three come from:

budget_sourceSourceHow to read it
absent (0)The transaction’s ComputeBudget instructions: legacy and v0 transactions, and rows indexed before v1 support.priority_fee is floor(cu_price × cu_limit ÷ 1,000,000), not the fee the runtime charged. It is 0 when the transaction set a CU price without an explicit CU limit (the runtime then charges the price × its default limit, which is not recorded).
1A v1 transaction (SIMD-0385, active on mainnet since slot 447120000) whose budget config we read.priority_fee is the total priority fee declared and paid, cu_limit is the declared limit (capped at 1,400,000), and cu_price is derived as priority_fee × 1,000,000 ÷ cu_limit.
2A v1 transaction whose budget config did not reach us.priority_fee is the total paid (the fee minus the signature fees). cu_price and cu_limit are unknown.

PumpSwap (venue 1) and xStocks (venue 2) rows carry no compute budget at all: cu_price, cu_limit and priority_fee are 0 and budget_source is absent, v1 transactions included. That 0 means not measured, not a zero bid. An absent budget_source does not prove the transaction was legacy or v0.

On budget_source 2 rows, the "0" in cu_price and cu_limit is not a zero bid: both values are unknown. Leave those rows out of price comparisons and averages.

Non-SOL quotes. When quote_mint is present on a pump.fun curve (venue 0) or PumpSwap (venue 1) row, the swap is quoted in that token:

  • sol_amount and price are 0.
  • quote_amount, fee and creator_fee are raw units of the quote (divide by 10^quote_decimals). On PumpSwap rows, fee, creator_fee and lp_fee are 0.
  • tip and priority_fee stay in lamports.
  • quote_symbol and quote_decimals describe the quote when known. quote_decimals is absent while unknown, so never assume it: quotes use 4 to 12 decimals.

xStocks rows (venue 2, quoted in USDC or USDT) are different: sol_amount repeats quote_amount and price is the USD price per share. SOL-quoted rows carry none of these fields.

Bundle flag. bundled is true when another transaction on the same token landed in the same slot at block_index ±1 (the way a Jito bundle lands). It is decided per transaction, so every leg of a transaction (same block_index, different ix_index) carries the same flag. It is checked against all the swaps of the token, not only the rows of the page.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/swaps?order=desc&limit=1" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "time": "2026-06-21T09:41:14Z", "mint": "9xQm…pump", "trader": "8psN…VRtf", "is_buy": true, "sol_amount": "0", "token_amount": "31250000000000", "price": "0", "fee": "108829987", "creator_fee": "34367364", "lp_fee": "0", "creator": "5Q5q…Funr", "tip": "1000000", "tip_wallet": "Cb3f…g9rE", "v_sol_reserves": "30488888889", "v_token_reserves": "1041666666666666", "real_sol_reserves": "488888889", "real_token_reserves": "761250000000000", "fee_payer": "8psN…VRtf", "cu_price": "120000", "cu_limit": "200000", "priority_fee": "24000", "slot": 348812994, "block_index": 1287, "sig": "4Fr4…ULFK", "ix_index": 3, "bundled": false, "quote_mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn", "quote_amount": "11455788057", "quote_symbol": "PUMP", "quote_decimals": 6, "venue": 0, "router": "BSfD…bot", "router_name": "Photon" } ], "next_cursor": "2026-06-21T09:41:14Z" }

Token price candles

GET/tokens/{mint}/candles4 credits

Returns OHLCV candles (open, high, low, close, volume and trade count) for price charts.

ParameterInDescription
mintpathToken mint address.
tfqueryTimeframe: 1s, 30s, 1m, 1h or 1d.
fromqueryStart of the range.
toqueryEnd of the range.
limitqueryNumber of candles to return.
quotequeryQuote mint. Builds candles from the swaps quoted in that token.

Units.

  • Without quote, candles are built from SOL-quoted swaps: price in SOL per token, volume in lamports.
  • With quote=<mint>, price is raw quote per raw token (multiply by 10^(6 − quote_decimals)) and volume is raw quote units.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/candles?tf=1m&limit=1" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "time": "2026-06-21T09:41:14Z", "open": "0.00000042", "high": "0.00000051", "low": "0.00000039", "close": "0.00000048", "volume": "488888889", "trades": 137 } ] }

Token price ticks

GET/tokens/{mint}/ticks4 credits

Per-swap price series for line charts: every swap is one point, with no candle grouping. Column arrays keep the page small, about 45 bytes per swap.

ParameterInDescription
mintpathToken mint address.
quotequeryQuote mint. Selects the swaps quoted in that token.
beforequeryOpaque cursor for the previous page (see Pagination).
afterqueryOpaque cursor for the swaps that arrived after a page (see Pagination).
limitqueryMax 5000, default 2000.

Response arrays. Arrays are in chronological order, oldest first.

  • t — block time in Unix milliseconds, at seconds resolution, so several swaps can share it.
  • p — price per token in the quote unit.
  • s — 1 for a buy, 0 for a sell.
  • a — swap amount in the quote unit.
  • dev — indexes of the token creator’s trades.

Which swaps. The same ones the candles use. Without quote, the swaps with a SOL price (p in SOL per token, a in SOL); with quote=<mint>, the swaps quoted in that token (p and a in that token, decimals applied). Every kind of trade is included, since protocol buybacks and route legs move the pool too. Reverted attempts are not.

Pagination. Cursor-based, and the cursors are opaque.

  • Pass older as before= for the previous page.
  • Pass newer as after= for the swaps that arrived after this page, to catch up after a reconnect. On an empty after page, newer repeats your cursor.
  • before and after are exclusive and cannot be combined.
  • A page can hold fewer than limit swaps without being the end: keep following older until history_start is true. Then no earlier swap is indexed (older still names the first swap of the page).

quote_decimals is absent while the quote’s decimals are not verified. p and a are then in raw quote units: divide both by 10^quote_decimals once known.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/ticks?limit=3" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "quote_mint": "", "quote_symbol": "SOL", "quote_decimals": 9, "t": [1758800401000, 1758800401000, 1758800404000], "p": [2.8411e-8, 2.8637e-8, 2.8502e-8], "s": [1, 1, 0], "a": [0.5, 1.25, 0.8], "dev": [1], "older": "1758800401000000_369000000_12_0_5kQm…", "newer": "1758800404000000_369000008_3_1_3aBz…", "history_start": false }

Token trading activity

GET/tokens/{mint}/activity10 credits

The activity strip: trading stats over 5m, 1h and 24h windows, plus per-minute buy/sell flow.

ParameterInDescription
mintpathToken mint address.
  • windows — per-window stats. vol is lamports from SOL-quoted swaps only; txns, buys, sells, buyers and sellers count every swap.
  • flow — per-minute buy/sell flow.
  • recent_ids — sig:ix_index of the swaps already in this snapshot since recent_since. Use them to reconcile incoming WebSocket trades without double-counting.

Quote. quote_mint is always present:

  • "" — the token traded in SOL over the last 24h.
  • A mint — more than half of its 24h swaps were quoted in that single token. The response then also carries quote_symbol / quote_decimals (when known), and every window carries vol_quote, the volume in raw units of that quote (divide by 10^quote_decimals).

A token trading on several non-SOL quotes at once reports "".

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/activity" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "quote_mint": "", "windows": [ { "w": "24h", "vol": "488888889", "txns": 1342, "buys": 812, "sells": 530, "buyers": 401, "sellers": 287 } ], "flow": [ { "t": 1750498800, "buy": "312500000", "sell": "176388889" } ] }

Holders & live stats

Token holders, holder concentration, live tab counters, the token intelligence overview and smart money.

Token holders

GET/tokens/{mint}/holders3 credits

Lists the token’s holders ordered by balance, each with realized PnL in a position object.

ParameterInDescription
mintpathToken mint address.
limitqueryNumber of holders to return.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/holders?limit=1" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "trader": "8psN…VRtf", "mint": "9xQm…pump", "symbol": "PEPE", "name": "Pepe the Frog", "token_balance": "1284000000000", "sol_invested": "4500000000", "sol_received": "1200000000", "tokens_bought": "1500000000000", "tokens_sold": "216000000000", "realized_pnl": "-180000000", "avg_cost": "0.003", "current_price": "488888889", "first_trade_at": "2026-06-21T09:41:14Z", "last_trade_at": "2026-06-24T17:03:55Z", "trade_count": 7 } ] }

Holder count and concentration

GET/tokens/{mint}/holder-stats3 credits

Returns the token’s holder count and supply concentration (held, top10, top25).

ParameterInDescription
mintpathToken mint address.
  • source — swap_estimate for an indexed estimate, or onchain for a confirmed on-chain snapshot (when configured).
  • slot — also included in onchain responses.

Transfers are not included in swap estimates.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/holder-stats" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "source": "swap_estimate", "updated_at": "2026-09-10T15:00:00Z", "holders": 1342, "held": "873421889999", "top10": "412889123456", "top25": "588123987654" }

Live token counters

GET/tokens/{mint}/counters5 credits

Returns the live counters behind the token-detail tabs: holder stats plus the smart, bundle and dev counts.

ParameterInDescription
mintpathToken mint address.

smart and dev are capped at 50 and 100, matching the visible lists.

Live updates. The token-counters:{mint} WebSocket topic pushes the same snapshot as data in a token_counters event. See Streams.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/counters" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "updated_at": "2026-09-10T15:00:00Z", "holder_stats": { "source": "swap_estimate", "updated_at": "2026-09-10T15:00:00Z", "holders": 1342, "held": "873421889999", "top10": "412889123456", "top25": "588123987654" }, "smart": 4, "bundle": 3, "dev": 6 }

Token intelligence

GET/tokens/{mint}/intelligence10 credits

Returns the current token overview and recent price episodes: PnL breakdown, snipers, buy and sell flow, and a pattern label. SOL pairs only.

ParameterInDescription
mintpathToken mint address.

Live updates. Subscribe to token-intelligence:{mint} over /ws (see Streams): the initial snapshot and full replacements arrive as token_intelligence events.

Freshness. Refreshes are shared and run every 2 seconds. When a token’s snapshot is expensive to compute, the same snapshot is reused for up to 5 seconds before it is computed again. When a refresh fails, the previous snapshot (about a minute old at most) can be sent again: updated_at gives its age.

PnL and balances. PnL uses indexed average cost; missing bases remain unknown. pnl.source says where balances come from:

  • indexed_transfers — reconstructed as buys − sells + transfers in − transfers out (burns count as transfers out).
  • swap_estimate — from trades alone. These balances are not current ownership.
  • onchain — configured on-chain balances.

Supply shares use the standard 1B supply, or 2B for mayhem-mode tokens.

Coverage. partial flags bounded coverage, including tokens created before indexed transfer history begins and tokens whose transfer history is too long to read within the refresh time limit. When the transfer history is incomplete, the snapshot is served as swap_estimate, and balances_unreconciled and untraced_supply_pct are not evaluated (always false and 0).

Reconciliation. balances_unreconciled means indexed trades and transfers do not account for at least untraced_supply_pct of supply (threshold 1%).

Do not display holder counts, supply shares, sniper holdings or holder PnL when pnl.source is swap_estimate (those balances are not current ownership) or when balances_unreconciled is true (they are then unreliable).

Bundle and shared-funder patterns are evidence, not proof of common control.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/intelligence" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "updated_at": "2026-09-10T17:39:24Z", "window_start": "2026-09-10T17:34:24Z", "supported": true, "partial": false, "supply_source": "standard_supply_estimate", "pnl": { "total": 128, "profit": 48, "loss": 59, "flat": 3, "unknown": 18, "source": "indexed_transfers" }, "snipers": { "total": 18, "holding": 7, "closed": 11, "unknown": 0, "supply_pct": 3.8, "partial": false }, "wallets": [], "events": [], "buy_sol": "12", "sell_sol": "42", "buyers": 8, "sellers": 24, "pattern": "Concentrated selling", "untraced_supply_pct": 0.2, "balances_unreconciled": false }

Smart money wallets

GET/tokens/{mint}/smart12 credits

Lists the smart-money wallets holding or trading this token, with their position in it.

ParameterInDescription
mintpathToken mint address.
limitqueryNumber of wallets to return.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/smart?limit=40" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "trader": "8psN…VRtf", "mint": "9xQm…pump", "token_balance": "488888889123456", "sol_invested": "12500000000", "sol_received": "4200000000", "tokens_bought": "612345678901234", "tokens_sold": "123456789777778", "realized_pnl": "1875000000", "avg_cost": "0.0000204", "current_price": "0", "first_trade_at": "2026-06-21T09:41:14Z", "last_trade_at": "2026-06-27T08:12:03Z", "trade_count": 17 } ] }

Launch & insiders

How a pump.fun token launched: launch bundles, the launch race, mempool buyers and insider funding clusters.

Launch bundles

GET/tokens/{mint}/launch14 credits

Launch analysis: the token’s first swaps grouped into bundles, plus the dev bundle.

ParameterInDescription
mintpathToken mint address.
limitqueryLimit; the example request uses 150.

Each entry in bundles carries its wallets, totals and swaps. Swap rows use the same fields as Token swaps.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/launch?limit=150" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "creator": "5Q5q…Funr", "bundled_pct_supply": 4.88888889, "dev_bundle_pct_supply": 4.88888889, "bundle_count": 1, "bundles": [ { "slot": 339481577, "start_index": 412, "size": 2, "is_bundle": true, "has_dev": true, "wallets": [ "5Q5q…Funr", "8psN…VRtf" ], "sol_total": "488888889", "tokens_bought": "48888888900000", "pct_supply": 4.88888889, "swaps": [ { "time": "2026-06-27T09:41:14Z", "mint": "9xQm…pump", "trader": "5Q5q…Funr", "is_buy": true, "sol_amount": "300000000", "token_amount": "30000000000000", "price": "0.00000001", "fee": "1500000", "creator_fee": "150000", "lp_fee": "300000", "creator": "5Q5q…Funr", "tip": "1000000", "tip_wallet": "Jee7…xQ2", "v_sol_reserves": "30300000000", "v_token_reserves": "1042857142857142", "real_sol_reserves": "300000000", "real_token_reserves": "42857142857142", "fee_payer": "5Q5q…Funr", "cu_price": "250000", "cu_limit": "120000", "priority_fee": "30000", "slot": 339481577, "block_index": 412, "sig": "4Fr4…ULFK", "ix_index": 3, "bundled": true, "quote_mint": "So11111111111111111111111111111111111111112", "quote_amount": "300000000", "venue": 0 }, { "time": "2026-06-27T09:41:14Z", "mint": "9xQm…pump", "trader": "8psN…VRtf", "is_buy": true, "sol_amount": "188888889", "token_amount": "18888888900000", "price": "0.00000001", "fee": "944444", "creator_fee": "94444", "lp_fee": "188888", "creator": "5Q5q…Funr", "tip": "500000", "tip_wallet": "Jee7…xQ2", "v_sol_reserves": "30488888889", "v_token_reserves": "1023968253957142", "real_sol_reserves": "488888889", "real_token_reserves": "61746031757142", "fee_payer": "8psN…VRtf", "cu_price": "200000", "cu_limit": "120000", "priority_fee": "24000", "slot": 339481577, "block_index": 413, "sig": "5Gh2…RtfK", "ix_index": 3, "bundled": true, "quote_mint": "So11111111111111111111111111111111111111112", "quote_amount": "188888889", "venue": 0 } ] } ] }

Launch race

GET/tokens/{mint}/launch-race12 credits

Who tried to get into this token at birth, and who made it: every attempt, in true arrival order (slot, then position inside the block). Versus compares two wallets you pick; this is the other half, everyone who was there. The failed attempts are what make it worth reading: winners are visible anyway, losers are not.

ParameterInDescription
mintpathToken mint address.
slotsquery1 to 150, default 30 (covering the first ~20 seconds).

Outcomes. Each attempt gets an outcome:

  • won — the first outside wallet in.
  • dev_buy — the creator’s own buy.
  • landed — a landed attempt.
  • rejected — the venue turned it down, with the decoded reason.
  • self_abort — its own routing contract stopped it; it lost to nobody.
  • failed_unknown — reverted before we recorded which program stopped it.

The dev does not win the race. On pump.fun the creator’s buy lands with the token’s own creation, so it always lands first: measured on five consecutive tokens, winner and creator were the same address every time. Calling it the winner describes the transaction format, not a contest, so the title goes to the first non-creator wallet in (first_outside) and the creator is flagged dev.

Bots declining to trade are not defeats. On a measured launch, 3,062 of 3,116 attempts were 14 bots declining to trade, 219 sprays each. Counting them as defeats reads as “3,116 contenders, 45 got in, 1.4% success”; the truth is 25 wallets reached the venue and 21 got in, 83%.

Bundles. A landed attempt is flagged bundled when another landed transaction on the token sits in the same slot at block_index ±1, the way a Jito bundle lands.

  • Any landed transaction on the token counts, also one the board does not show.
  • The creator alone is not a bundle.
  • Reverted attempts are never bundled nor count as neighbours.
  • bundle_size counts the bundled attempts in the creation slot.

Per-attempt fields. Every attempt carries:

  • tip, priority_fee, cu_price and cu_limit.
  • budget_source — as on Token swaps; absent means 0.
  • fee — for an attempt that landed, the pump.fun protocol fee of the buy; for a reverted one, the network fee it paid anyway, in lamports.
  • price and sol, for the ones that landed.
  • provider — the tip relay.
  • program — the router or aborting contract.
  • The transaction signature.
  • The leader — the validator that produced that slot. On a race decided by position rather than price, it is often the only thing that explains the result.

Bids. The response returns winner_cu_price against losing_cu_price_max, which often shows the winner did not outbid the field. Attempts with budget_source 2 are v1 transactions whose CU price is unknown, so they take part in no bid comparison: losing_cu_price_max is the highest known rejected bid.

Check winner_bid_known before reading winner_cu_price. When the winner itself has budget_source 2, winner_bid_known is false and winner_cu_price reads "0", which then means unknown, not a zero bid. winner_cu_price is always a string of digits; with no outside winner it is "0" and winner_bid_known is true.

Non-SOL quotes. Landed attempts quoted in a token other than SOL carry quote_mint, quote_amount (raw units), quote_symbol and quote_decimals (absent while unknown) instead of sol. Their fee is then in raw units of that quote, not lamports.

The response also includes a per-slot breakdown (by_slot) with the median tip.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/launch-race?slots=30" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "symbol": "WIF", "created_slot": 436991078, "created_block_index": 412, "attempts": 3116, "landed": 45, "contenders": 39, "winner": "8psN…VRtf", "winner_cu_price": "1000000", "winner_bid_known": true, "losing_cu_price_max": "39760000", "self_aborts": 3062, "unknown_outcome": 0, "headline": "The winner did not outbid the field — someone offered more and still did not get in, so position in the block decided it, not price.", "by_slot": [ { "slots_after_creation": 0, "attempts": 11, "landed": 3, "wallets": 10, "median_tip": "229830000" } ], "board": [ { "wallet": "8psN…VRtf", "slots_after_creation": 0, "block_index": 412, "outcome": "won", "cu_price": "1000000", "tip": "229830000", "sol": 1.4 }, { "wallet": "Cb3f…g9rE", "slots_after_creation": 0, "block_index": 480, "outcome": "rejected", "why": "slippage: Too much SOL required to buy the given amount of tokens.", "cu_price": "39760000" }, { "wallet": "7QnR…mK2v", "slots_after_creation": 1, "block_index": 96, "outcome": "self_abort", "why": "The routing contract stopped the transaction itself — its own guard rejected the trade, so the venue never ran. A higher priority fee would not have changed the outcome.", "program": "GpmL…JhJd" } ] }

Mempool buyers

GET/mempool-buyers10 credits

Lists wallets that tried to buy a token before it existed. A failed buy on a mint at a slot earlier than the token’s creation means that wallet already knew the address; it did not guess it. Either it was told, or it was watching the mempool.

ParameterInDescription
daysquery1 to 60, default 1.

Returns both the raw events and a per_wallet roll-up:

  • max_slots_before — how far ahead of creation the earliest attempt landed: the measure of how early they knew.
  • landed — whether that wallet then actually managed to buy.

A rare signal. The numbers say why it has to be precomputed rather than queried: in a measured 24h there were 32,465,136 failed buys and 33,649 tokens created, and exactly 84 rows satisfy the condition, one in 386,000. A background job accumulates them; this endpoint just reads.

Request
curl -s "https://terminal.raiden.wtf/api/mempool-buyers?days=1" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "since_days": 1, "per_wallet": [ { "wallet": "7QnR…mK2v", "tokens": 3, "attempts": 11, "max_slots_before": 6135, "landed": 2, "last_time": "2026-08-07T14:22:09Z" } ], "events": [ { "wallet": "7QnR…mK2v", "mint": "9xQm…pump", "symbol": "QMASCOT", "creator": "5Q5q…Funr", "attempts": 4, "slots_before": 6135, "slot": 437805588, "created_slot": 437811723, "sig": "5KJp…9xQm", "create_sig": "3Ftz…La9k", "landed": true, "time": "2026-08-07T14:22:09Z" } ] }

Insider funding clusters

GET/tokens/{mint}/funding-clusters8 credits

Insider detection: the token’s early buyers grouped by shared origin funder.

ParameterInDescription
mintpathToken mint address.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/funding-clusters" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "early_buyers": 500, "clustered": 14, "clusters": [ { "funder": "5Q5q…Funr", "funder_label": "Dev wallet", "count": 6, "is_dev": true, "wallets": [ "8psN…VRtf", "Cb3f…g9rE", "Gm4w…9xZ2" ] } ] }

Transfers & distribution

Token movements that never touch the market: raw transfers for a token or a wallet, and who is distributing a token.

Token transfers

GET/tokens/{mint}/transfers8 credits

The raw wallet-to-wallet movements of this token, newest first. These are the rows behind /sends, for when you want to rebuild the graph yourself instead of taking our verdict.

ParameterInDescription
mintpathToken mint address.
windowquery6h, 24h or 168h: caps how far back a single call looks. By default it widens automatically until the page fills, max 7d. Go further back with the cursor.
limitqueryMax 500.

Transfers never touch the market: no price, no SOL, and they appear in no volume metric. Burns are not wallet-to-wallet movements and are not listed.

  • amount — raw units, and the authoritative field. These reach 1e15, so it is a string.
  • amount_token — the same value divided by decimals, for convenience.
  • "ambiguous": true — balance deltas cannot say who sent to whom (several senders and several receivers of this mint, or several senders when some tokens were also burned in the same transaction). The pair shown is one of the possible ones, not a certainty; the movement itself did happen.

Pagination. Cursor-based, and the cursor is opaque: follow next_cursor until it is absent.

Do not build the cursor yourself. time alone is not unique here: it is the ingest instant, shared by every row of the same batch (up to 20 identical for one mint), so a time-only cursor silently skips rows.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/transfers?limit=100" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "time": "2026-08-07T15:14:17.339373Z", "slot": 437811723, "block_index": 422, "sig": "5KJp…9xQm", "ix_index": 0, "mint": "9xQm…pump", "from": "7EJq…rE7U", "to": "CYZb…Fb9k", "amount": "235918501", "decimals": 6, "amount_token": 235.918501 } ], "next_cursor": "MTc1NDU4…fDQyMnww" }

Wallet token transfers

GET/wallets/{trader}/token-transfers8 credits

Token movements in and out of a wallet: the half its swaps cannot show. A wallet can end up holding tokens it never bought and lose them without ever selling, and neither shows in trade history.

ParameterInDescription
traderpathWallet address.
directionqueryin (received), out (sent) or all (default).
windowquerySame rules as on Token transfers.
limitquerySame rules as on Token transfers.

Same opaque cursor and same row shape as /tokens/{mint}/transfers. Received tokens with no matching buy are the signature of a sybil fleet or a bundle being seeded.

Not to be confused with /wallets/{trader}/transfers, which is native SOL.

Request
curl -s "https://terminal.raiden.wtf/api/wallets/8psN…VRtf/token-transfers?direction=in" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "data": [ { "time": "2026-08-07T15:14:17.339373Z", "slot": 437811723, "block_index": 422, "sig": "5KJp…9xQm", "ix_index": 0, "mint": "9xQm…pump", "from": "7EJq…rE7U", "to": "8psN…VRtf", "amount": "235918501", "decimals": 6, "amount_token": 235.918501 } ], "next_cursor": "" }

Token sends and distribution

GET/tokens/{mint}/sends6 credits

Who is distributing this token, and to whom. Sends never touch the market, so they appear in no volume metric: a wallet can leave the holder list without ever selling, and hundreds of holders can appear without anyone buying.

ParameterInDescription
mintpathToken mint address.
wqueryWindow: 1h, 24h or 7d.

Who received it matters more than how many. The number that matters is not how many wallets received the token: it is how many of them had never bought it. On a real token one wallet sent to 971 recipients in a minute, which looks like a sybil fleet. But 966 of them already held the token, so it went to people who were already in. Counting recipients alone would have cried wolf.

Relay chains matter even more. Many recipients pass the token straight on. Measured across 57 tokens: 46,117 A→B→C chains and 469 relay nodes, some forwarding 100% of what they receive. Where that happens, “it reached someone” is false: the token is circulating, so the relay_chain verdict takes precedence.

Verdicts. verdict is one of:

  • relay_chain — recipients forward it: the token is moving through a chain, not arriving.
  • manufactured_holders — recipients had never entered through the market: holders created, not earned.
  • to_existing_holders — they were already in.
  • mixed.

Per distributor. Each entry in distributors reports sends, recipients, how many never bought, and max_fanout: the widest single transaction. Reaching 20 wallets in one transaction is a programmed distribution, while reaching 20 across twenty transactions can be anything.

flagged is false below 5 recipients: that is someone sending to a friend, not a distribution.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/sends?w=24h" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "window": "24h", "sends": 1071, "senders": 2, "receivers": 971, "ambiguous": 0, "fresh_receivers": 5, "fresh_pct": 0.51, "relay_receivers": 12, "relay_pct": 1.24, "flagged": true, "verdict": "to_existing_holders", "headline": "Sent to 971 wallets, and 99% of them already held the token — this went to people who were already in, not to new wallets.", "distributors": [ { "wallet": "CKDe…tXn8", "sends": 971, "receivers": 971, "fresh_receivers": 5, "fresh_pct": 0.51, "max_fanout": 20, "tokens": 51978.5 } ] }

Risk signals

Rug and manipulation checks for a token: the Raiden Trust score, repeat rug dumpers, activity authenticity, wash traders and the dev-quality filters.

Raiden Trust score

GET/tokens/{mint}/trust15 credits

Raiden Trust is a live 0-100 risk score for a token, where higher is safer. It is computed fully live from current holders, with no cached verdict.

ParameterInDescription
mintpathToken mint address.

Verdict.

  • clean — score ≥ 65.
  • caution — 40-64.
  • likely_rug — below 40.

Signals. The score blends 5 weighted signals. Each one reports its raw value and its contribution (comp) to the score:

  • dev reputation;
  • known rug-dumpers currently in the token (holding vs already sold, plus serial-ring members);
  • bundled/insider supply %;
  • dev exit %;
  • wash-trading %.

Caps. capped and cap_reason are set when one hard signal (heavy bundling, ring holding, confirmed rug…) forces the ceiling down.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/trust" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "score": 45, "verdict": "caution", "capped": true, "cap_reason": "bundled", "rugged": false, "signals": { "dev_score": { "value": 0, "comp": 8.4, "known": true }, "dumpers_holding": { "value": 3, "comp": 15.0, "known": true }, "dumpers_sold": { "value": 5, "comp": 6.0, "known": true }, "ring_holding": { "value": 1, "comp": 15.0, "known": true }, "bundled_pct": { "value": 52.0, "comp": 0.0, "known": true }, "dev_exit": { "value": 100.0, "comp": 6.1, "known": true }, "wash_pct": { "value": 27.0, "comp": 4.3, "known": true } }, "dev_dump_slot": 434305434, "weights": { "dev": 0.35, "offenders": 0.25, "bundle": 0.15, "exit": 0.10, "wash": 0.15 } }

Repeat rug dumpers

GET/tokens/{mint}/repeat-offenders20 credits

Flags wallets in this token that took part in previous rug dumps: they sold in the dev’s dump slot or within a few slots after. Buyers are victims and are never counted.

ParameterInDescription
mintpathToken mint address.
limitqueryNumber of wallets to return.
  • same_slot — sold in the very slot of the dev’s dump.
  • seen_in — sample tokens they dumped before.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/repeat-offenders?limit=50" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "flagged": 8, "this_token": { "rugged": true, "dev_dump_slot": 434305434, "co_dumpers": 36, "same_slot": 1 }, "data": [ { "wallet": "6hh9…Nfew", "rug_count": 1670, "same_slot_count": 595, "as_operator": 0, "as_sniper": 1274, "sol_extracted": 14.21, "seen_in": ["$Gentlemen", "$Mosquito", "$Groundhog"], "seen_in_more": 15, "last_seen": "2026-07-21T13:05:11Z" } ] }

Activity authenticity

GET/tokens/{mint}/authenticity8 credits

Is this token’s activity real? Hundreds of holders and constant trading can be manufactured for a few cents of SOL, and by eye they are indistinguishable from a live token, which is exactly what makes it work.

ParameterInDescription
mintpathToken mint address.
wqueryWindow: 1h, 24h or 7d.

How it’s judged. The signal is who pays the fees: fee_payer can differ from the trader, and paying someone else’s fees is an ongoing operational link. But wallet count alone cannot judge it, because a trading platform covering gas for its users looks identical on that axis.

What separates them is capital per wallet, and the measured gap is a chasm: real users sit above 0.5 SOL each, manufactured fleets below 0.0001, with nothing in between.

The response returns:

  • verdict — manufactured, platform_sponsored or organic.
  • groups — the share of the token’s wallets behind each payer.
  • The SOL actually deployed.
  • headline — a plain-language summary.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/authenticity?w=24h" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "window": "24h", "wallets_total": 397, "verdict": "manufactured", "headline": "100% of the wallets trading this token have their fees paid by a single address that puts up almost no capital — 396 wallets on 0.1564 SOL in total. The holder count and the trade count are made, not earned.", "manufactured_wallets": 396, "manufactured_share_pct": 99.75, "capital_used_sol": 0.1564, "groups": [ { "payer": "5c8T…yrn", "wallets": 396, "swaps": 1327, "sol": 0.1564, "share_of_token_wallets_pct": 99.75, "sol_per_wallet": 0.000395, "kind": "manufactured" } ] }

Wash traders

GET/tokens/{mint}/wash-traders6 credits

Wash-trading detection: wallets that repeatedly buy and sell this token to inflate fake volume. These round-trippers made at least 5 buys and at least 5 sells in the last 24h.

ParameterInDescription
mintpathToken mint address.
  • wash_pct — estimate of how much of the 24h volume is artificial.
  • data — the top 20 round-trippers.
  • flagged — the full count.

Quote. Amounts are measured in the token’s quote, and quote_mint is always present:

  • "" means SOL: wash_vol_sol, total_vol_sol and vol_sol are in SOL.
  • A mint means more than half of the 24h swaps were quoted in that single token (the same rule as Token trading activity). Then wash_vol_quote, total_vol_quote and each row’s vol_quote are raw units of that quote (divide by 10^quote_decimals; quote_symbol / quote_decimals when known), while the _sol fields read 0.
Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/wash-traders" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "window_h": 24, "flagged": 6, "shown": 6, "wash_vol_sol": 128.4, "total_vol_sol": 472.9, "wash_pct": 27.2, "quote_mint": "", "data": [ { "wallet": "6hh9…Nfew", "buys": 41, "sells": 39, "vol_sol": 88.2 } ] }

Dev filter presets

GET/dev-filters/presetsfree

Lists the dev-quality filters, what each one actually tests, and the bit it occupies in the filter mask of the screener.

Use it to build a filter set programmatically instead of hardcoding bit positions, which may move.

Request
curl -s "https://terminal.raiden.wtf/api/dev-filters/presets" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "filters": [ { "bit": 0, "id": "spam_rate", "name": "High tokens/day", "desc": "Creator launches far more tokens per day than a real project would" } ] }

All-in-one dossier

One request for the whole picture of a token.

Full token dossier

GET/tokens/{mint}/packup to 40 credits

Deep-look bundle: one call returns the whole token dossier instead of fanning out 9 requests.

ParameterInDescription
mintpathToken mint address.
  • Each key under pack is the exact response of the matching standalone endpoint, or null if that part failed. The pack itself never fails.
  • Sub-calls reuse the same cache as the individual endpoints, so it’s lighter on the backend than calling them yourself.
  • as_of — when the bundle was assembled.
Key under packSame response as
tokenToken snapshot
activityToken trading activity
launchLaunch bundles
holder_statsHolder count and concentration
smartSmart money wallets
repeat_offendersRepeat rug dumpers
trustRaiden Trust score
wash_tradersWash traders
funding_clustersInsider funding clusters

API key only: on the website, without a key, it answers 403 api_key_required.

Request
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/pack" \ -H "X-API-Key: $RAIDEN_KEY"
Response
{ "mint": "9xQm…pump", "as_of": "2026-07-22T14:03:00Z", "pack": { "token": { "...": "= GET /tokens/{mint}" }, "activity": { "...": "= GET /tokens/{mint}/activity" }, "launch": { "...": "= GET /tokens/{mint}/launch" }, "holder_stats": { "...": "= GET /tokens/{mint}/holder-stats" }, "smart": { "...": "= GET /tokens/{mint}/smart" }, "repeat_offenders": { "...": "= GET /tokens/{mint}/repeat-offenders" }, "trust": { "...": "= GET /tokens/{mint}/trust" }, "wash_traders": { "...": "= GET /tokens/{mint}/wash-traders" }, "funding_clusters": { "...": "= GET /tokens/{mint}/funding-clusters" } } }
Last updated on