Skip to content
API AccessScanner API reference

Solana explorer

Transactions, addresses, transfers, origin of funds, tokens, trades, charts, blocks, network stats and search resolution on Solana.

The same data as the Explorer pages, as JSON. Every explorer route is free.

15 routes, all under /explorer. Every path below is served under https://api.scanner.net, and every request carries the key header, so those two are not repeated per route. Shared errors, limits and response formats are in Requests and errors.

  • Response shape: every route returns { "success": true, "data": ... }. The response sections below describe data.
  • Per-IP limit: explorer routes allow 60 requests per minute per client IP, on top of the key limit. See Per-IP limits.
  • Filters: an invalid filter value is ignored, not refused. An invalid before cursor starts again from the first page.
  • Route errors: besides the errors below, any explorer route can return 504 TIMEOUT when the upstream data provider times out.

Transaction

GET /explorer/tx/{signature}

One transaction, parsed and labelled.

ParameterInTypeRequiredNotes
signaturepathstringyesTransaction signature.
rawquerystringno1 or true adds raw, the full parsed transaction from the RPC.
curl "https://api.scanner.net/explorer/tx/SIGNATURE" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: an ExplorerTransactionDetail. Key fields: signature, slot, blockTime (unix seconds, or null), status (success or fail), error, fee and priorityFee (lamports), signers, enhanced (the decoded description, or null), instructions, logMessages, balanceChanges, tokens (metadata by mint) and identities (labels by address).

StatusCodeWhen
400INVALID_INPUTNot a valid signature.
404NOT_FOUNDTransaction not found.

Address

GET /explorer/address/{address}

A summary of any Solana address.

ParameterInTypeRequiredNotes
addresspathstringyesSolana address.
curl "https://api.scanner.net/explorer/address/WALLET_ADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: an ExplorerAddressSummary: address, solBalance (lamports), detection (isToken, isContract, isWallet, isPool, owner), domains, identity when labelled, cachedScan (available, scannedAt, scanId) and txCount (value, and exact: false from 1,000 up). An address with no activity still returns a summary.

StatusCodeWhen
400INVALID_ADDRESSNot a Solana address.

Address transactions

GET /explorer/address/{address}/txs

An address's transactions, newest first by default.

ParameterInTypeRequiredNotes
addresspathstringyesSolana address.
limitqueryintegerno1 to 100. Default 25.
beforequerystringnoPage cursor: nextBefore from the previous page.
typequerystringnoTransaction type, for example SWAP or TRANSFER.
statusquerystringnosuccess or failed.
fromqueryintegernoEarliest time, unix seconds.
toqueryintegernoLatest time, unix seconds.
byquerystringnoOnly transactions this address paid the fee for.
sourcequerystringnoComma-separated program sources, for example JUPITER. At most 10.
sortquerystringnoasc for oldest first. The filters above are then ignored.
offsetqueryintegernoWith sort=asc: rows to skip. Default 0.
windowquerystringnoWith sort=asc: first1h for the address's first hour of activity.
curl "https://api.scanner.net/explorer/address/WALLET_ADDRESS/txs?limit=50&type=SWAP" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: transactions (each with signature, type, source, slot, timestamp, description, fee, feePayer, transactionError, nativeTransfers and tokenTransfers), nextBefore (cursor, or null at the end) and stillMore. A filtered page can be shorter than limit with stillMore: true; keep paging. With sort=asc the response adds nextOffset and oldestAvailable.

Oldest-first walks of addresses that aren't cached yet are limited to a few per IP every 10 minutes. Past that, the route returns an empty page with oldestAvailable: false rather than an error. oldestAvailable: false also means the history is too long to walk from the start.

StatusCodeWhen
400INVALID_ADDRESSNot a Solana address.

Address transfers

GET /explorer/address/{address}/transfers

SOL and token transfers in and out of an address, newest first.

ParameterInTypeRequiredNotes
addresspathstringyesSolana address.
limitqueryintegerno1 to 100. Default 25.
beforequerystringnoPage cursor: nextBefore from the previous page.
directionquerystringnoin or out.
mintquerystringnoA token mint, or native for SOL.
typequerystringnosol or spl.
fromquerystringnoComma-separated sender addresses, at most 20. Prefix one with - to exclude it.
toquerystringnoComma-separated recipient addresses, same rules as from.
amountquerystringnoToken amount range, min-max. Either side can be left out, for example 1000-.
usdquerystringnoUSD value range, min-max.
sourcequerystringnoComma-separated program sources. At most 10.
actionquerystringnoComma-separated transaction types. At most 10.
curl "https://api.scanner.net/explorer/address/WALLET_ADDRESS/transfers?direction=in&mint=MINT_ADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: transfers (each with signature, blockTime, slot, mint, amount in token units, usdValue, from, to, direction (in, out or self), source and txType), nextBefore, stillMore, tokens and identities. Pages end on a transaction boundary, so a page can hold slightly more than limit rows.

StatusCodeWhen
400INVALID_ADDRESSNot a Solana address.

Address origin

GET /explorer/address/{address}/origin

Where an address's money came from: its funding chain, walked back to the first labelled entity, up to 20 hops. A trace that isn't cached can take 5 to 15 seconds.

ParameterInTypeRequiredNotes
addresspathstringyesSolana address.
curl "https://api.scanner.net/explorer/address/WALLET_ADDRESS/origin" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: an ExplorerAddressOrigin: address, status (ok, no_origin, not_wallet, is_entity or unavailable), directFunder, origin, hops, terminalReason (labeled, depth, loop or no_funder), cached and tracedAt.

Cached origins are always served. New traces are limited to a few per IP every 10 minutes.

StatusCodeWhen
400INVALID_ADDRESSNot a Solana address.
429RATE_LIMITEDThe trace isn't cached and the IP's trace budget is spent. Try again in a few minutes.

Cached origins

POST /explorer/origins

Cached funder and origin labels for up to 30 addresses at once. It reads only what is already cached and never starts a trace.

ParameterInTypeRequiredNotes
addressesbodystring[]yesSolana addresses. Invalid ones and duplicates are dropped, and only the first 30 are used.
curl -X POST "https://api.scanner.net/explorer/origins" \
  -H "x-api-key: $SCANNER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"addresses":["WALLET_ADDRESS"]}'

Response: { "origins": { "<address>": { "address", "funder", "funderEntity", "origin" } } }. Addresses with nothing cached are left out.

StatusCodeWhen
400INVALID_INPUTThe body has no non-empty addresses array of strings.

Token

GET /explorer/token/{mint}

A token's metadata, market stats, security flags, pools and top holders.

ParameterInTypeRequiredNotes
mintpathstringyesToken mint address.
curl "https://api.scanner.net/explorer/token/MINT_ADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: an ExplorerTokenOverview: mint, metadata (symbol, name, decimals, supply, logoUri, links), stats (priceUsd, marketCap, fdv, liquidityUsd, volume24h, priceChange24h, holderCount), security (mint and freeze authority, Token-2022 extensions, riskScore, risks, top10HolderPct), pools, creator, createdAt (unix milliseconds), launchpad, topHolders (up to 100) and cachedContractScan. Fields Scanner has no data for are left out.

StatusCodeWhen
400INVALID_MINTNot a valid mint address.

Token transfers

GET /explorer/token/{mint}/transfers

Transfers of one token, newest first.

ParameterInTypeRequiredNotes
mintpathstringyesToken mint address.
limitqueryintegerno1 to 100. Default 25.
beforequerystringnoPage cursor: nextBefore from the previous page.
fromquerystringnoComma-separated senders, at most 20. - prefix excludes.
toquerystringnoComma-separated recipients, same rules.
amountquerystringnoToken amount range, min-max.
curl "https://api.scanner.net/explorer/token/MINT_ADDRESS/transfers?amount=1000-" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: the same shape as Address transfers.

StatusCodeWhen
400INVALID_MINTNot a valid mint address.

Token trades

GET /explorer/token/{mint}/trades

Buys and sells of a token, about 50 per page.

ParameterInTypeRequiredNotes
mintpathstringyesToken mint address.
cursorquerystringnonextCursor from the previous page.
sortquerystringnodesc (newest first, default) or asc.
sidequerystringnobuy or sell.
minUsdquerynumbernoSmallest trade in USD.
maxUsdquerynumbernoLargest trade in USD.
walletquerystringnoOnly this wallet's trades.
curl "https://api.scanner.net/explorer/token/MINT_ADDRESS/trades?side=buy&minUsd=1000" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: trades (each with signature, wallet, type, amountToken, amountUsd, priceUsd and time in unix milliseconds), nextCursor and stillMore.

StatusCodeWhen
400INVALID_MINTNot a valid mint address.

Token chart

GET /explorer/token/{mint}/chart

Price candles for a token.

ParameterInTypeRequiredNotes
mintpathstringyesToken mint address.
intervalquerystringno1m, 5m, 15m, 30m, 1h, 4h, 6h, 12h or 1d. Default 15m.
fromqueryintegernoStart, unix seconds.
toqueryintegernoEnd, unix seconds.
curl "https://api.scanner.net/explorer/token/MINT_ADDRESS/chart?interval=1h" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: { "interval": "1h", "points": [{ "t", "open", "high", "low", "close", "volume" }] }, with t in unix seconds.

StatusCodeWhen
400INVALID_MINTNot a valid mint address.

Block

GET /explorer/block/{slot}

A block, with one page of its transactions and stats over the whole block.

ParameterInTypeRequiredNotes
slotpathintegeryesSlot number.
pagequeryintegernoDefault 1.
pageSizequeryintegerno1 to 100. Default 25.
sortquerystringnoindex (default), or highest first by fee, priorityFee, jitoTip, feePerCu, cuUsed, cuRequested or solMovement.
clsquerystringnoComma-separated transaction classes: 0 success, 1 Jito, 2 failed, 3 vote. Default 0,1,2, which hides votes.
curl "https://api.scanner.net/explorer/block/SLOT?pageSize=50&sort=priorityFee" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: an ExplorerBlockDetail: slot, blockhash, parentSlot, blockTime, blockHeight, txCount, transactions (this page), filteredCount, page, pageSize, totalPages, stats (whole block), chart (one row for every transaction in the block, so it can be large) and identities.

StatusCodeWhen
400INVALID_INPUTNot a valid slot number.
404NOT_FOUNDBlock not found or not available.

Network

GET /explorer/network

Current Solana network stats. No parameters.

curl "https://api.scanner.net/explorer/network" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: slot, blockHeight, epoch, epochProgressPct, epochSlotsRemaining, tps, solPriceUsd, recentBlocks and history (recent snapshots).

StatusCodeWhen
503INTERNAL_ERRORNetwork stats are unavailable.

Live blocks and activity

GET /explorer/network/blocks
GET /explorer/network/activity

The latest blocks, and the latest blocks with recent transactions. No parameters. Responses aren't cached.

curl "https://api.scanner.net/explorer/network/activity" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: /network/blocks returns a list of { slot, blockHeight, blockTime, txCount }. /network/activity returns { blocks, transactions }.

GET /explorer/resolve

Works out what a search string is, the way the explorer search box does.

ParameterInTypeRequiredNotes
qquerystringyes1 to 100 characters: a slot, signature, address, .sol domain or truncated address.
curl "https://api.scanner.net/explorer/resolve?q=WALLET_ADDRESS" \
  -H "x-api-key: $SCANNER_API_KEY"

Response: { "kind", "value" }. kind is block, tx, address, token, partial (a truncated address; look it up with the wallet finder) or unknown. A .sol domain resolves to its address.

StatusCodeWhen
400INVALID_INPUTq is missing, empty or too long.

View this page as Markdown