Reference

Endpoint

GET /v1/wallets/{address}/history

Returns every buy/sell trade for the wallet.

Request

curl -N "https://veltrabot.com/v1/wallets/{address}/history" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

A default call streams the history as NDJSON — one JSON object per line. Trade batches arrive as { "trades": [...] } the moment they're fetched, so a large wallet fills in gradually over the one open connection with no extra calls. A final line { "complete": true, "tradeCount": ..., "wallet": ..., "firstTrade": ... } ends the stream.

{"trades":[{"signature":"43C6...aY1Ve2X","side":"sell","token":"Benny","tokenMint":"9xY2...pump","amountSol":0.0448,"amount":152340.12,"dex":"Pump.fun","blockTime":"2026-07-19T07:37:17+00:00"}, ...],"cursor":"8kQ2mZ...f0X"}
{"trades":[ ...more trades as they're fetched... ],"cursor":"pW3nZ2...Kd9"}
{"complete":true,"tradeCount":354,"wallet":"BtDyZ4EF...AAu9","firstTrade":"2026-07-12T07:39:02+00:00"}

Each trade carries amountSol (the SOL value of the trade) and amount (the token quantity moved), plus tokenMint — the token's mint address, a stable per-token key since symbols can collide. Together they let you compute cost basis and realized PnL. Either numeric field may be null when it can't be determined for a trade.

Read the response line by line: accumulate every line's trades, and stop when you hit the line carrying complete. Most wallets stream in full on that single call. A wallet too large to finish within about 55 seconds ends with complete: false and a cursor — the rest keeps loading in the background.

Stopping & resuming: close the connection any time to stop the stream (e.g. an AbortController, or Ctrl-C). Every batch line carries a cursor, so to pick up where you left off just start a new request with ?cursor= set to the last cursor you received (no limit) — the stream resumes from exactly that point.

See Response Times for how long a lookup takes.

Pagination

Prefer discrete, single-JSON pages over the stream? Pass limit and/or cursor and each call returns one ordinary JSON page (not NDJSON): trades capped to limit rows (default 1,000, no maximum) plus a cursor for the next page. Send the cursor back exactly as you received it to get the next page — don't try to read or change it. Follow it until a response omits cursor, which happens only when complete is true. For a still-loading wallet you'll keep getting a cursor even at the end of what's stored so far; if a page comes back empty with complete: false, wait a moment and re-request that same cursor to pick up newly-loaded trades. Every trade counts toward your usage once. When paging through a wallet with a cursor re-reads trades you already have, those trades don't count again.

For a very large wallet still loading, each page reports complete: false until loading finishes — so a missing cursor marks the end of the full history only when complete is true. While it's false, more trades are still landing; re-request shortly and continue.

curl "https://veltrabot.com/v1/wallets/{address}/history?limit=100" \
  -H "Authorization: Bearer YOUR_API_KEY"

{
  "wallet": "BtDyZ4EFJz7poZVNVcDQCaQqWVADseVuYMmaq5fbAAu9",
  "complete": false,
  "tradeCount": 354,
  "pageSize": 100,
  "totalPages": 4,
  "trades": [ /* 100 trades */ ],
  "cursor": "8kQ2mZ3rV9...tLf0X"
}

curl "https://veltrabot.com/v1/wallets/{address}/history?limit=100&cursor=8kQ2mZ3rV9...tLf0X" \
  -H "Authorization: Bearer YOUR_API_KEY"

Chains

The endpoint covers Solana, every major EVM chain, and Tron. Add ?chain=<slug> to select one — it defaults to sol, so existing Solana calls are unchanged. The wallet address is validated against the chain's address family: base58 for Solana, 0x… for EVM chains, and T… for Tron. On non-Solana chains, amountSol carries the native token amount (ETH/BNB/TRX/…) rather than SOL.

Chain?chain=AddressStatus
Solanasolbase58Live
Ethereumeth0x… (EVM)Live
Basebase0x… (EVM)Live
BSCbsc0x… (EVM)Live
TrontronT… (Tron)Live
Hyperliquidhyperevm0x… (EVM)Live
Monadmonad0x… (EVM)Live
Robinhoodrobinhood0x… (EVM)Live