NFT / Marketplace·Ethereum · Solana · Bitcoin · BNB Chain · Polygon · Arbitrum · Optimism · Base · Avalanche · Aptos · Sui · TON
NFTScan
Multichain NFT data API and JS/TS SDK with assets, transactions, collections, and analytics across 20+ EVM chains and Solana, Bitcoin, Aptos, Sui, TON.
- 01multichain NFT lookups
- 02wallet NFT portfolios
- 03collection analytics
- 04transfer history
- 05floor price feeds
- pnpm add nftscan-api
| Variable | Scope | Description |
|---|---|---|
| NFTSCAN_API_KEY | Server | NFTScan developer API key from developer.nftscan.com (10k req/day free tier). |
Use NFTScan for cross-chain NFT data fetching. Initialize the JS SDK once with `new NftscanEvm({ apiKey: process.env.NFTSCAN_API_KEY!, chain: EvmChain.ETH })` then call `evm.asset.getAssetsByAccount(address, { erc_type: 'erc721' })` for wallet portfolios or `evm.collection.getCollection(contractAddress)` for floor data. For non-EVM chains import `NftscanSolana`, `NftscanBtc`, etc., each with their own clients. Always pass the API key server-side; cache responses for 30–60s since pricing endpoints are rate-limited.
- ⚑Each chain has its own SDK client and own base URL — sharing the same instance across chains silently sends every call to the first chain configured.
- ⚑Royalty fields in collection responses reflect on-chain EIP-2981 only; marketplace-enforced royalties (Blur, OpenSea operator filter status) are not surfaced — query the marketplace API separately if you need real-world enforcement signal.
- ⚑Rate limits are per-key per-second AND per-day; bursting wallet portfolio scans across many addresses will 429 long before the daily cap — batch with `getAllAssets` cursors instead of parallel requests.
- ⚑Image URLs returned are NFTScan-mirrored proxies, not the original IPFS CIDs; if you need the canonical `tokenURI` for persistence, parse `metadata_json` and re-pin yourself.
- ⚑Solana / Bitcoin / TON endpoints have different schemas than EVM — don't assume `contract_address` exists; Solana uses `mint_address`, Bitcoin Ordinals use `inscription_id`.