NFTs API
One NFT's transfers or sales
One NFT's latest 50 transfers (mint, transfer, burn) or marketplace sales with price, currency, marketplace, seller and buyer, newest first, and whether older ones exist.
/api/external/nft-analysis/nft-item-history/{chain}/{address}What it returns
One NFT's history, newest first, up to 50 events: its transfers (mints and burns included) or its marketplace sales, with price, currency, marketplace, seller and buyer. hasMore says whether older events exist.
Chains
- BNB Chain BNB
- Ethereum ETH
- Base BASE
- Robinhood Chain RHC
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -H "x-dex-data-key: $DEXDATA_API_KEY" \ "https://api.dexdata.io/api/external/nft-analysis/nft-item-history/BNB/<address>?tokenId=<tokenId>"
| Parameter | Description |
|---|---|
tokenIdquery · string · required | The token id, in decimal, e.g. "1". Leading zeros are ignored; at most 2^256 − 1. |
typequery · string · optional | transfers (default) or sales. Sales are not served on RHC.transferssales |
chainpath · string · required | ETH, BNB, BASE or RHC (transfers only on RHC). SOL, STABLE and ARC return 400: no wired source answers single-NFT history there. CELO, ARB, OP and SCROLL return 400 here. |
addresspath · string · required | The NFT collection's contract address. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
contract | string | The collection contract, lowercase. |
tokenId | string | The token id, in decimal. |
type | string | The history asked for. |
transfers | object[] | null | Newest first. null when type is sales. An empty list means no transfer is known — a token id the collection never minted answers the same. |
transfers[].at | string | null | Block time, ISO-8601 in UTC. |
transfers[].blockNumber | integer | null | The block number. |
transfers[].txHash | string | null | The transaction hash. |
transfers[].logIndex | integer | null | The event's position in the block. |
transfers[].from | string | null | The sender, lowercase — the zero address on a mint. |
transfers[].to | string | null | The receiver, lowercase — the zero address on a burn. |
transfers[].kind | string | null | mint from the zero address, burn to it, transfer otherwise. |
transfers[].amount | string | null | Units moved, as a decimal string: "1" for an ERC-721, the count moved for an ERC-1155. null for an ERC-1155 on RHC. |
sales | object[] | null | Newest first. null when type is transfers. An empty list means no marketplace sale is known. |
sales[].at | string | null | Block time, ISO-8601 in UTC. |
sales[].blockNumber | integer | null | The block number. |
sales[].txHash | string | null | The transaction hash. |
sales[].marketplace | string | null | The marketplace, e.g. "opensea". |
sales[].seller | string | null | The seller, lowercase. |
sales[].buyer | string | null | The buyer, lowercase. |
sales[].price | string | null | The price paid, as an exact decimal string in priceCurrency — never a number, it can carry 18 decimals. |
sales[].priceCurrency | string | null | The token paid, by symbol (e.g. "ETH", "WETH") or, when it has none, by name. null when unknown. |
sales[].priceCurrencyAddress | string | null | The contract of the token paid, lowercase. null when paid in the chain's native coin. |
sales[].itemsInSale | integer | null | Tokens sold in the same sale. Above 1, price is for all of them, not this one alone. |
hasMore | boolean | Whether older events exist beyond the 50 listed. |
transferCount | integer | null | How many transfers this NFT has had, all time. The length of transfers when hasMore is false; on RHC, counted in full when older transfers exist; otherwise null. Always null when type is sales. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key