查询转账历史
按代币、交易对手、时间、数量或美元价值筛选。
实时订阅转账
追踪一个钱包、一个代币,或某个钱包的某个代币。
查询转账历史
GET /account/{address}/transfers 返回钱包的转入和转出记录,按从新到旧排序。SPL 转账通过钱包拥有的代币账户匹配,每一方都同时给出代币账户(address)和拥有该账户的钱包(owner)。
默认情况下,历史记录不包含有 DEX 活动的交易,例如兑换、添加和移除流动性以及领取池手续费,因此你得到的是钱包的普通转账。设置 dex=include 可保留这些交易,设置 dex=only 则只返回这些交易。
amount是原始整数数量,uiAmount是精确十进制数量,两者均为字符串。timestamp是区块时间,单位为 Unix 秒。type为sol表示原生 SOL,为spl表示代币转账。SOL 使用 wrapped SOL mintSo11111111111111111111111111111111111111112。status是交易结果,为success或failed。除非指定status=failed或status=any,否则不包含失败的交易。price和value仅在historicPrices=true或使用价值筛选时返回。identity:钱包身份已知时出现在from或to上,例如 KOL、交易所、池、开发者或 SNS 名称。
筛选历史
每个参数只有一个名称。端点无法识别的参数名会返回 400,并告诉你正确的名称,例如
unknown parameter timeStart; use start,因此拼写错误不会返回未经筛选的页面。
historicPrices=true 会添加 price.usd 和 value.usd,即转账发生时代币的美元价格,取自转账前最多一小时内最近的一根 1 分钟 K 线。没有价格时两者为 null。
什么算作 DEX 活动
当交易中有转账发往或来自某个池时,该交易即视为有 DEX 活动。池是指 DEX 或发射台程序拥有的账户,例如 pump.fun 联合曲线或 Meteora DLMM 池,或者 Raydium、Meteora 的金库权限账户。这涵盖兑换、添加和移除流动性,以及领取手续费和奖励。钱包发出一种代币并收到另一种代币的交易也算在内。dex=exclude 和 dex=only 作用于整笔交易:交易中的所有转账会一起被排除或保留。只有匹配 direction 和 mint 的转账会被检查,因此设置了这两个筛选时,如果某笔交易中与池相关的那段转账被筛掉,该交易就会被视为普通转账。
按交易分组
添加grouped=true,同时获取 transactions,即本页转账按签名分组的结果。每笔交易包含其 transfers、转账数量 legs、totals.in、totals.out 和 totals.tokens,以及 dex。dex 为 true 时 type 为 swap;当钱包发出一种代币并收到另一种代币时,swap 会给出转入和转出的代币。启用 historicPrices=true 时,合计还会带有美元金额:totals.value、totals.net,以及每一侧的 usd。
分页
将pagination.next 作为 cursor 传回,并保持筛选不变,直到 hasMore 为 false。一页不会拆分交易,因此转账数可能比 limit 略多或略少;grouped=true 时,limit 通常按交易计数。带筛选的请求每次只读取有限数量的转账,因此即使 hasMore 仍为 true,一页也可能少于 limit 条,甚至为空。继续翻页即可。
使用 minValue 或 maxValue 时,每页会为接下来的 limit 笔转账计价,并返回其中匹配的转账。如果无法及时读取价格,请求会返回 503;重新发送即可。
使用 TypeScript SDK
安装 0.6.0 或更高版本的@solana-tracker/data-api。getAccountTransfers 接受与接口相同的筛选参数,地址类筛选可以传数组或逗号分隔的字符串。SDK 会按 API 的规则检查参数,对 API 会拒绝的请求在发送前抛出 ValidationError。iterateAccountTransfers 会自动跟随 pagination.next,遇到带筛选的空页也会继续翻页。
{ grouped: true } 时,TypeScript 会推断出响应带有 transactions。
实时订阅转账
使用 Data API 密钥连接wss://datastream.solanatracker.io/{apiKey}。Datastream 适用于 Premium、Business 和 Enterprise 套餐。
选择房间
transfer:wallet:{wallet}:某个钱包在所有代币上的转入和转出。transfer:{mint}:某个代币的所有转账。不支持 SOL。transfer:{mint}:{wallet}:某个代币转入或转出某个钱包。使用 wrapped SOL mint 时也支持 SOL。
:enriched,为每笔转账和余额变化添加 token(名称、符号、图片、精度)、price.usd、value.usd 和 marketCap.usd,并为每笔转账的 from 和 to 以及每条余额变化添加 identity:钱包的 KOL 资料、机器人、平台、开发者、池子或 SNS 标签,与交易房间相同;钱包没有身份时为 null。SOL 的 marketCap.usd 为其价格乘以流通供应量;USDC、USDT 和 USD1 没有该值。增强消息可能比普通消息晚最多 250 毫秒到达;如果某项查询耗时更长,消息会带 enrichmentStatus: "partial",缺失的值为 null。
使用 SDK 订阅
SDK 自动处理心跳和重连。transfers.wallet、transfers.token 和 transfers.tokenWallet 分别订阅三个房间;设置 { enriched: true } 订阅 :enriched 房间。transfers.token 不支持 SOL,会直接抛出错误;SOL 请使用 transfers.wallet,或将 wrapped SOL mint 传给 transfers.tokenWallet。
读取消息
每条消息对应一笔交易:transfers是此房间的转账,按指令顺序排列。id格式为signature:instruction:inner,每笔转账唯一。钱包房间会设置direction。带转账手续费的 Token-2022 转账包含fee,amount为扣除手续费前的数量。balances是此房间在该交易中的余额变化:钱包的、代币的,或钱包在该代币上的。cause为transfer、swap(交易者交易的代币)或other。手续费支付者的 SOL 记录带有fee,已包含在change中。- 兑换保留在交易房间中。 已推送的兑换中的转账不会再次发送。兑换的剩余部分,例如平台手续费、小费或付给其他钱包的款项,会带
swapTx: true推送。 - 不属于转账: 包装(wrap)、解包(unwrap)以及钱包自有账户之间的转移。失败的交易不会推送。
:enriched 房间中,同一条消息还会带有 token、price、value、marketCap 和 identity。在下面的例子中,一位 KOL 将某个代币卖出换成 SOL;付给另一个钱包的 SOL 手续费是兑换的剩余部分,因此带 swapTx: true 推送。
下一步
账户转账 API 参考
所有参数和响应字段。
Datastream 协议
连接、加入房间并处理心跳。