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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
created_leader— the validator that produced the creation slot:identity,name,client,version,jito,stake, plus its geo region (countryISO code andcity). 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}/metareturns. 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Returns the off-chain metadata from the token URI: image, socials and description.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/meta" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Redirects (302) to the token image, for use in an <img src>. No response body is needed: follow the Location.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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:
| Response | Meaning | Cache |
|---|---|---|
404 with max-age | No image, or not a Solana address. Final. | 1 hour |
404 with max-age | The metadata is waiting for a retry. | 90 s |
404 with max-age | The 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-store | The 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 |
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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
order | query | desc or asc. |
cursor | query | Boundary time. |
limit | query | Number of rows to return. |
failed | query | 1 interleaves reverted attempts; their rows carry "failed": true. |
transfers | query | 1 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 intoand atoken_amount, but nopriceand nosol_amount: they never went through the market, and zeroing those fields would read as “sold for nothing”. "ambiguous": truemeans 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_source | Source | How 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). |
1 | A 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. |
2 | A 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_amountandpriceare0.quote_amount,feeandcreator_feeare raw units of the quote (divide by10^quote_decimals). On PumpSwap rows,fee,creator_feeandlp_feeare0.tipandpriority_feestay in lamports.quote_symbolandquote_decimalsdescribe the quote when known.quote_decimalsis 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/swaps?order=desc&limit=1" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Returns OHLCV candles (open, high, low, close, volume and trade count) for price charts.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
tf | query | Timeframe: 1s, 30s, 1m, 1h or 1d. |
from | query | Start of the range. |
to | query | End of the range. |
limit | query | Number of candles to return. |
quote | query | Quote 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 by10^(6 − quote_decimals)) and volume is raw quote units.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/candles?tf=1m&limit=1" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
quote | query | Quote mint. Selects the swaps quoted in that token. |
before | query | Opaque cursor for the previous page (see Pagination). |
after | query | Opaque cursor for the swaps that arrived after a page (see Pagination). |
limit | query | Max 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—1for a buy,0for 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
olderasbefore=for the previous page. - Pass
newerasafter=for the swaps that arrived after this page, to catch up after a reconnect. On an emptyafterpage,newerrepeats your cursor. beforeandafterare exclusive and cannot be combined.- A page can hold fewer than
limitswaps without being the end: keep followingolderuntilhistory_startistrue. Then no earlier swap is indexed (olderstill 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/ticks?limit=3" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
The activity strip: trading stats over 5m, 1h and 24h windows, plus per-minute buy/sell flow.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
windows— per-window stats.volis lamports from SOL-quoted swaps only;txns,buys,sells,buyersandsellerscount every swap.flow— per-minute buy/sell flow.recent_ids—sig:ix_indexof the swaps already in this snapshot sincerecent_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 carriesvol_quote, the volume in raw units of that quote (divide by10^quote_decimals).
A token trading on several non-SOL quotes at once reports "".
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/activity" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Lists the token’s holders ordered by balance, each with realized PnL in a position object.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
limit | query | Number of holders to return. |
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/holders?limit=1" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Returns the token’s holder count and supply concentration (held, top10, top25).
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
source—swap_estimatefor an indexed estimate, oronchainfor a confirmed on-chain snapshot (when configured).slot— also included inonchainresponses.
Transfers are not included in swap estimates.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/holder-stats" \
-H "X-API-Key: $RAIDEN_KEY"{
"source": "swap_estimate",
"updated_at": "2026-09-10T15:00:00Z",
"holders": 1342,
"held": "873421889999",
"top10": "412889123456",
"top25": "588123987654"
}Live token counters
Returns the live counters behind the token-detail tabs: holder stats plus the smart, bundle and dev counts.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/counters" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Returns the current token overview and recent price episodes: PnL breakdown, snipers, buy and sell flow, and a pattern label. SOL pairs only.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/intelligence" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Lists the smart-money wallets holding or trading this token, with their position in it.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
limit | query | Number of wallets to return. |
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/smart?limit=40" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Launch analysis: the token’s first swaps grouped into bundles, plus the dev bundle.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
limit | query | Limit; the example request uses 150. |
Each entry in bundles carries its wallets, totals and swaps. Swap rows use the same fields as Token swaps.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/launch?limit=150" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
slots | query | 1 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_sizecounts the bundled attempts in the creation slot.
Per-attempt fields. Every attempt carries:
tip,priority_fee,cu_priceandcu_limit.budget_source— as on Token swaps; absent means0.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.priceandsol, 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/launch-race?slots=30" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
days | query | 1 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.
curl -s "https://terminal.raiden.wtf/api/mempool-buyers?days=1" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Insider detection: the token’s early buyers grouped by shared origin funder.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/funding-clusters" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
window | query | 6h, 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. |
limit | query | Max 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 bydecimals, 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/transfers?limit=100" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
trader | path | Wallet address. |
direction | query | in (received), out (sent) or all (default). |
window | query | Same rules as on Token transfers. |
limit | query | Same 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.
curl -s "https://terminal.raiden.wtf/api/wallets/8psN…VRtf/token-transfers?direction=in" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
w | query | Window: 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/sends?w=24h" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/trust" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
limit | query | Number of wallets to return. |
same_slot— sold in the very slot of the dev’s dump.seen_in— sample tokens they dumped before.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/repeat-offenders?limit=50" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
w | query | Window: 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_sponsoredororganic.groups— the share of the token’s wallets behind each payer.- The SOL actually deployed.
headline— a plain-language summary.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/authenticity?w=24h" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
| Parameter | In | Description |
|---|---|---|
mint | path | Token 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_solandvol_solare 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_quoteand each row’svol_quoteare raw units of that quote (divide by10^quote_decimals;quote_symbol/quote_decimalswhen known), while the_solfields read0.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/wash-traders" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
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.
curl -s "https://terminal.raiden.wtf/api/dev-filters/presets" \
-H "X-API-Key: $RAIDEN_KEY"{
"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
Deep-look bundle: one call returns the whole token dossier instead of fanning out 9 requests.
| Parameter | In | Description |
|---|---|---|
mint | path | Token mint address. |
- Each key under
packis the exact response of the matching standalone endpoint, ornullif 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 pack | Same response as |
|---|---|
token | Token snapshot |
activity | Token trading activity |
launch | Launch bundles |
holder_stats | Holder count and concentration |
smart | Smart money wallets |
repeat_offenders | Repeat rug dumpers |
trust | Raiden Trust score |
wash_traders | Wash traders |
funding_clusters | Insider funding clusters |
API key only: on the website, without a key, it answers 403 api_key_required.
curl -s "https://terminal.raiden.wtf/api/tokens/9xQm…pump/pack" \
-H "X-API-Key: $RAIDEN_KEY"{
"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" }
}
}