Skip to main content
GET
Single swap by transaction signature

Authorizations

X-API-Key
string
header
required

Preferred for swaps-api endpoints (/swaps/*, /stats/*, /trending, /pool-events).

Path Parameters

signature
string
required

Response

Swap event

A single swap event from the raw swaps index. Same shape across /swaps, /swaps/range, /swaps/whale, /swaps/{signature}, /swaps/trader/{wallet}, /swaps/token/{mint}.

Note that the streaming feeds (WebSocket and gRPC) use a different shape — see WebSocket wire format — most notably swap_type (string) vs is_buy (bool) here, and dex as the string name vs dex as the integer ID here.

signature
string

Solana transaction signature (base58).

slot
integer<int64>
timestamp
integer<int64>

Unix epoch milliseconds.

token_address
string

Non-SOL side of the pool (the token being bought/sold).

pair_address
string

On-chain pool/LP account.

user
string

Trader wallet.

is_buy
boolean

true if SOL → token; false if token → SOL.

dex
enum<integer>

Integer DEX identifier used in raw swap rows. Mapping:

Available options:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
sol_amount
integer<int64>

Lamports (1 SOL = 1e9).

token_amount
integer<int64>

Token base units; divide by 10**quote_decimals for human-readable.

fee
integer<int64>

LP fee paid, in lamports.

fee_bps
integer

Effective LP fee, in basis points.

creator_fee
integer<int64>

Creator-set fee paid, in lamports (pump.fun + meteora-dbc).

creator_fee_bps
integer
price_per_token
number

The price this trade executed at, in lamports per atomic token unit — it is exactly sol_amount / token_amount, computed from the trade's own two legs and nothing else. Scale it once for SOL per whole token: price_per_token * 10**(quote_decimals - base_decimals) (equivalently price_per_token * 10**quote_decimals / 1e9, since base_decimals is 9). Reading the raw value as SOL-per-token overstates it by 10**(9 - quote_decimals) — 1000x for a 6-decimal token. Because it never touches pool reserves, this is the one price field that is correct on all ten venues and across all history; prefer it over pool_price whenever you need a price a trade could actually fill at. Matches the definition on ScreenerResultV2.price_per_token.

pool_price
number

The ratio of the pool's reported SOL reserve to its reported token reserve, scaled to SOL per whole token and passed through as the venue published it. It is a reserve statistic, not a tradeable quote. On constant-product and bonding-curve pools it lands within about a fee of the executed price; on concentrated-liquidity pools (raydium_clmm, orca, meteora_damm_v2, meteora_dlmm) the reported reserves are whole-pool inventory rather than the liquidity at the active price, and on PumpSwap pools that migrated from the pump.fun bonding curve after mid-July 2026 the ratio understates the price by (sol_reserve + 17.58) / sol_reserve. Use price_per_token for the price a trade executed at. Per-venue measured gaps are in Data coverage.

price_impact_bps
integer | null

Nullable (GraphQL: Int; the WebSocket feed is nullable too). null where no impact was computed: on meteora_dbc and meteora_pools; on orca, raydium_amm, raydium_cpmm, raydium_clmm, meteora_dlmm and meteora_damm_v2 for swaps from before that venue started computing it and for swaps that couldn't be priced; on trades by pump.fun's own Mayhem program (agent_trade = 2, and older zero-fee pumpfun trades by the same program); and on dust trades whose smaller leg (sol_amount or token_amount, in base units) is under 10,000, where one unit of rounding moves the executed price by more than 1 bp. On REST and GraphQL a 0 is a real reading: on pumpfun and pumpswap an impact under 1 bp (truncated). On the six venues above the value is the executed price against the pool's price just before the trade, pool fee included, rounded to the nearest bp, so it is never 0; positive means the price moved against the trader. On pumpfun and pumpswap it is computed against the pool's own reserves (on pumpfun the curve after the trade, so it reads zero or negative). On pumpswap the comparison is corrected for the SOL a pump.fun-migrated pool holds outside the account the swap reports, so it does NOT inherit the understatement described for pool_price. It measures impact relative to the pool, not slippage against an external reference. REST and GraphQL clamp it to the Int16 range (−32,768 to 32,767); the WebSocket feed carries the full value. The gRPC streams don't carry this field.

base_decimals
integer

Decimals of the base (SOL) side — 9 on every venue.

quote_decimals
integer

Decimals of the quote side, i.e. the token's own decimals despite the name. Commonly 6, but 9 and other values are normal — read it per row.

virtual_sol_reserves
integer<int64>

Virtual SOL reserves (pump.fun bonding curve). 0 on non-pump pools.

virtual_token_reserves
integer<int64>
real_sol_reserves
integer<int64>

Pool reserves as reported alongside the swap. On the concentrated-liquidity venues these are whole-pool totals (TVL-like), not active-tick liquidity. On meteora_pools liquidity sits in shared dynamic vaults, so both reserve fields come back 0.

real_token_reserves
integer<int64>
transfer_fee_in
integer<int64>

Token-2022 transfer-fee paid on the input side (lamports/base units).

transfer_fee_out
integer<int64>
cashback
integer<int64>

Cashback rebated to the trader (lamports).

cashback_bps
integer