NFT Data

Real-time NFT and marketplace data

SimpleHash provides real-time access to NFT data and market prices across all of the main chains and ecosystems.

Using either our REST API, Webhooks or Kafka Streaming Service, it's easy to get transfers, current balances, metadata, media and market prices for any NFT. This makes it easy to build out user-facing crypto applications that rely on NFT data, including wallets, portfolio viewers, trading platforms, web3 social networks, tax software, and more.


What kinds of NFTs are supported?

SimpleHash supports the main NFT standards across the most popular developer ecosystems. Our indexer is generalized, meaning we ingest all NFTs and collections automatically, without them needing to be specifically whitelisted or added.

  • EVM chains: All ERC721 and 1155 tokens on the main EVM compatible chains, including Ethereum itself, and the main L2 networks, plus some legacy contracts (including cryptopunks and cryptokitties)
  • Solana: All Metaplex standard NFT tokens, including compressed NFTs
  • Bitcoin: Bitcoin Ordinals inscriptions
  • Flow: Most legacy contracts (e.g., NBA TopShot) and all tokens on Flow EVM (Crescendo)
  • Tezos: Tezos FA2 NFTs

We're routinely adding new chains - visit this page to see the full list: Supported Chains & Testnets


What kinds of NFT data are available?

SimpleHash provides the core primitives of NFT data, to make it easy to build any kind of functionality for different crypto use cases.

  • Balances: Current NFT balances for all tokens, and all wallets, can be queried using the API endpoints - balance changes are reflected within a few seconds
  • Transfers: All transfers for all NFT contracts are provided, including core details on the transfer - historical retention of transfers is all the way to the beginning of the respective token standards on each chain
  • Sales and Mints: We include sale details and mint details within the response bodies of both the Transfer endpoints and the NFT endpoints. For supported secondary market sale details, view the full list further down this page.
  • Secondary Market Floor Prices: Both real-time and historical floor prices for all collections on supported marketplaces are available. Prices are updated within a few seconds. See the full list of supported marketplaces here.
  • Listings and Bids: We provide real-time listing and bid data for selected chains across the main marketplaces.
  • Collection info: We assign unique identifiers to all collections across all chains, to support multiple ecosystems, and cases where collections are not 1:1 to contracts. We pull in on and off chain data on collection names, descriptions, media, social links, while also providing details on supply, and spam score filtering. To see the full set of fields available, view the collection types further down this page.

What is the difference between an NFT contract and a collection?

"Contract" and "Collection" are terms used to describe two related, but different kinds of groupings of NFTs. Their specific implementations differ across blockchain ecosystems.

  • Contracts:

    • On EVM-based chains, an NFT contract represents a smart contract (usually based on the ERC-721 or 1155 standards) that issued NFTs. Each contract has a unique on-chain address (e.g., 0x23581767a106ae21c074b2276d25e5c3e136a68b in the case of Moonbirds).
    • NFTs adhering to the 721 or 1155 standards can always be identified by the combination of their contract address and individual token ID. (Token IDs can be any number, but are often 1-9999 in the case of some popular PFP projects).
    • Because they are represented on-chain, contracts remain the same no matter what marketplace or protocol is interacting with the NFT.
    • Solana does not have the same notion as an NFT contract - each NFT is identified by a unique Base58 token address, and NFTs are more commonly grouped by collection
    • Bitcoin ordinals also does not use smart contracts. Each NFT is identified by a unique inscription ID.
  • Collections:

    • On EVM-based chains, it is common to refer to NFT collections, some of which are well known or have a high media profile. Where collections differ from contracts is that they are usually represented off-chain, most commonly being tied to a specific NFT marketplace. Taking Moonbirds again as the example, the homepage on OpenSea for the collection can be found here: https://opensea.io/collection/proof-moonbirds, with proof-moonbirds being a unique identifier.
    • Collections may be represented by different identifiers across different marketplaces and protocols.
    • Contracts and collections are often 1:1 (e.g., the Moonbirds collection on OpenSea only contains NFTs from the 0x23581767a106ae21c074b2276d25e5c3e136a68b contract), but not always. A prominent example is the OpenSea storefront contract - one of the contracts used to mint NFTs on Ethereum via OpenSea's platform. The address of this contract is 0x495f947276749ce646f68ac8c248420045cb7b5e - and it has millions of individual NFT token IDs.
    • This storefront contract also contains many individual collections - and the opposite situation can also be possible (a collection that contains multiple contracts)
    • On Solana, collections may be represented on or off-chain. Most Solana NFTs adhere to the Metaplex standard, which has a common way of verifying on-chain that a set of NFTs are part of a collection.
    • Because collections are treated differently not only across marketplaces, but also across chains, SimpleHash generates a unique identifier for each collection. This identifier can be found on either an NFT response body, or by querying one of the Collections by IDs (accepts metaplex_mint addresses for Solana), Contracts by Collection, or Collections by Marketplace endpoints

The SimpleHash API makes it easy to identify the contract and collection data for a given NFT, and also to query lists of NFTs based on these concepts.

  • EVM based NFTs:
    • The contract_address is a field on the main NFT body
    • The collection data can be found on the main NFT body, including the unique collection_id field
  • Solana based NFTs:
    • The contract_address field represents the unique token mint address for a specific NFT
    • The collection data can be found on the main NFT body, including the unique collection_id field
    • NFTs on a certain metaplex collection can be directly queried by passing the metaplex_mint as the collection identifer on the NFTs by Collection / Mint endpoint
    • This collection field also contains both a metaplex_mint field identifying collections verified on chain, and a metaplex_first_verified_creator, which is another way of identifying NFTs by collection, based on the identity of the initial NFT creator, for collections that have not been verified on-chain
  • Bitcoin based NFTs:
    • The contract_address field represents the Inscription ID of the ordinal.

NFT response models and types


NFT Model

The SimpleHash API returns NFT data in a standard format. The following are the fields included in the response (or as a list of NFT objects).

FieldDescriptionType(s)
nft_idUnique identifier for an NFT (chain.contract_address.token_id for EVM chains & Flow, chain.mint_address for Solana, chain.inscription_id for Bitcoin)string
chainName of the blockchain (e.g., ethereum)string
contract_addressAddress of the NFT's contract (hex format for EVM compatible chains). For Solana, this is a Base58-encoded string uniquely representing the NFT itself. For Bitcoin, this is the inscription ID.string
token_idToken ID (usually numeric) of the NFT on its contract. Will be null for Solana and Bitcoin NFTs, which are identified by contract_addressstring / null
nameName of the NFT derived from its metadatastring / null
descriptionDescription of the NFT derived from its metadatastring / null
previewsSet of URLs to resized preview images of the media, including an opengraph image, and blurhash, where available. Previews are sized to fit the maximum dimension in pixels as follows: (small: 250px, medium: 512px, large: 1000px).

These may be derived from images, videos, or 3D models.
{
image_small_url:string / null,
image_medium_url:string / null,
image_large_url:string / null,
image_opengraph_url:string / null,
blurhash: string / null,
predominant_color: string / null,
}
image_urlURL to cached image file on the SimpleHash CDN if availablestring / null
image_propertiesImage properties if available{
width:int / null,
height: int / null,
size : int / null,
mime_type: str / null,
exif_orientation: int / null,
} / null
video_urlURL to cached video file on the SimpleHash CDN if availablestring / null
video_propertiesVideo properties if available{
width: int / null,
height: int / null,
duration: float / null,
video_coding: str / null,
audio_coding: str / null,
size: int / null,
mime_type: str / null,
} / null
audio_urlURL to cached audio file on the SimpleHash CDN if availablestring / null
audio_propertiesAudio properties if available{
duration: float / null,
audio_coding: str / null,
size: int / null,
mime_type: str / null,
} / null
model_urlURL to cached 3D model file on the SimpleHash CDN if availablestring / null
model_propertiesModel properties if available{
size: int / null,
mime_type: str / null,
} / null
other_urlURL to cached file on the SimpleHash CDN if available for other media types such as PDFsstring / null
other_propertiesFile properties if available{
size: int / null,
mime_type: str / null,
} / null
background_colorBackground color of the NFT derived from its metadatastring / null
external_urlExternal URL derived from the NFT's metadata, often with more information (such as about the project), where availablestring / null
created_dateNFT minting datetime if known in timestamp format (e.g., 2021-07-03T23:45:00)string / null
statusNFT status, one of lazy-minted, minted, or burned. Items that are lazy-minted will switch to minted status upon the first on-chain transfer or sale.string
token_countKnown quantity of this NFTint / null
owner_countKnown number of owners of this NFTint / null
ownersArray of 0-50 top owners of this NFT (sorted by quantity desc). Dates are supplied in the yyyy-MM-dd'T'HH:mm:ss format[{
owner_address:string,
quantity: int,
quantity_string: string,
first_acquired_date: string / null,
last_acquired_date: string
}]
last_saleDetail on the most recent sale involving this NFTlast_sale / null
primary_saleDetail on the original sale (during the mint) for this NFTprimary_sale / null
first_createdFirst creation NFT details{
minted_to: string / null,
quantity: int / null,
quantity_string: string / null,
timestamp: string / null,
block_number: int / null,
transaction: string / null,
transaction_initiator: string / null
} / null
contractContract type info for this NFT (type is usually the standard for the contract, such as ERC721){
type:string,
name:string / null,
symbol:string / null
deployed_by: string / null
deployed_via_contract: string / null,
owned_by: string / null,
has_multiple_collections: bool
}
collectionThe associated collection information for this NFTCollection model
rarityThe associated rarity information for this NFTRarity model
royaltyArray of 0 or more royalty details, by source. Different marketplaces allow for different royalty amounts, so we show a list of the available information. When there are multiple sources, we list them from highest to lowest total_creator_fee_basis_points.

Current sources are: opensea, metaplex, erc2981

The list of recipients can have 0 or more wallets, as applicable. Amounts are shown in both basis_points (adding up to total_creator_fee_basis_points) and percentage, which is the share of this wallet's fees compared to other recipients.

Note that for the recipients list, OpenSea natively uses basis_points while Metaplex uses percentage, so if you need very precise amounts (i.e. no possibility of rounding), use basis_points for OpenSea & ERC2981 and percentage for Metaplex.
[{
source: string,
total_creator_fee_basis_points: int,
recipients: [{
address: string,
percentage: float,
basis_points: int
}]
}]
extra_metadataJSON field containing the additional custom metadata fields for the NFT added by the creator. Includes the image_original_url and animation_original_url links to the original media source (where available), and passes through other fields not standardized above (such as attributes or traits){
attributes: [{
trait_type:string / null,
value:string,
display_type:string / null
}],
...,
image_original_url:string / null,
animation_original_url:string / null,
metadata_original_url:string / null
}

Collection Model

The SimpleHash API returns information on the collection an NFT is associated with. These are often specific to certain NFT marketplaces. The following are the fields included for the collection model (appearing inline as a field on the NFT model).

For collection model found on NFT responses and core Collection endpoints:

FieldDescriptionType(s)
collection_idUnique identifier for a specific collection. This is distinct from contract address, since a contract may contain multiple collectionsstring / null
nameName of the collectionstring / null
descriptionDescription of the collectionstring / null
image_urlURL link to the collection logo / main image on the SimpleHash CDN, where availablestring / null
banner_image_urlURL link to the collection banner image on the SimpleHash CDN, where availablestring / null
categoryCollection category if available, currently one of: art, domain-names, gaming, memberships, music, pfps, photography, sports-collectibles, virtual-worlds

This list may grow over time.
string / null
is_nsfwCollection flagged as NSFWboolean / null
external_urlURL link to the external website or resource associated with the collectionstring / null
twitter_usernameTwitter handle of the account associated with the collection, where availablestring / null
discord_urlDiscord server associated with the collection, where availablestring / null
instagram_urlInstagram URL for the collection if availablestring / null
medium_usernameMedium.com username for the collection if availablestring / null
telegram_urlTelegram URL for the collection if availablestring / null
marketplace_pagesArray of 0 or more objects referencing the the collection's page(s) on a given marketplace. marketplace_collection_id is typically a case-sensitive slug (e.g., azuki for OpenSea) and sometimes an address (on marketplaces such as Quixotic and Stratos)[{
marketplace_id: string, marketplace_name:string,
marketplace_collection_id:string,
nft_url:string / null,
collection_url:string,
verified:boolean / null
}]
metaplex_mintUnique metaplex mint ID, populated only for Solana NFTs where there is a verified metaplex collectionstring / null
metaplex_candy_machineWhen a verified metaplex collection is not available, the candy machine address (if applicable) may be used to group the NFTsstring / null
metaplex_first_verified_creatorWhen other grouping methods are not available, this identifier may be used to group NFTs by the first verified creator addressstring / null
spam_scoreSpam rating of the NFT collection (for Enterprise plans), 0-100 range, (100 being most likely spam)int / null
floor_pricesArray of 0 or more floor prices for the collection, one for each marketplace[Floor price model
top_bidsArray of 0 or more top bids for the collection, one for each marketplace[Top bid model]
distinct_owner_countDistinct number of owners for NFTs in this collection. This and the following numbers may briefly be null for new collectionsint / null
distinct_nft_countDistinct number of unburned NFT IDsint / null
total_quantityTotal copies of unburned NFTs in this collection. For semi-fungibles, there may be more than one copy per NFT, so this value could exceed distinct_nft_countint / null
chainsArray of 1 or more chains in the collection. This is usually just 1, but OpenSea allows for multi-chain collections like this one spanning Polygon and BSC.[chain:string]
top_contractsOn chains with NFT smart contracts (EVM & Flow), array of 1 or more contracts associated with this collection, capped at a maximum of 20. This will be an empty array for Bitcoin and Solana.[contract_id:string]
collection_royaltiesArray of 0 or more royalty details, at the collection level, by source. Different marketplaces allow for different royalty amounts, so we show a list of the available information. When there are multiple sources, we list them from highest to lowest total_creator_fee_basis_points.

Current sources are: opensea

The list of recipients can have 0 or more wallets, as applicable. Amounts are shown in both basis_points (adding up to total_creator_fee_basis_points) and percentage, which is the share of this wallet's fees compared to other recipients.
[{
source: string,
total_creator_fee_basis_points: int,
recipients: [{
address: string,
percentage: float,
basis_points: int
}]
}]

Transfer Model

The SimpleHash API returns transfer data in a standard format. The following are the fields included in the response (or as a list of transfer objects). Transfers typically reflect the exchange of an NFT from one address to another.

FieldDescriptionType(s)
nft_idUnique identifier for an NFT (chain.contract_address.token_id for EVM chains & Flow, chain.mint_address for Solana, chain.inscription_id for Bitcoin)string
chainName of the blockchain (e.g., ethereum)string
contract_addressContract address of the NFT involved. Hex format for EVM-compatible chains. This is the mint address for Solana and Inscription ID for Bitcoin.string
token_idToken ID (usually numeric) of the NFT on its contract. This will be null for Solana and Bitcoin NFTsstring / null
collection_idThe unique identifier of the collection (obtainable from an NFT response, or from the Collection endpoints)string/ null
event_typeThe type of transfer, one of: mint, sale, transfer, burnstring
from_addressOriginating address for the transfer. Hex format for EVM-compatible chains. If null, this represents a minting eventstring / null
to_addressDestination address for the transfer. Hex format for EVM-compatible chains. If null, this represents a burn eventstring / null
quantityQuantity of this NFT being transferred (can be greater than 1 for ERC-1155s)int
quantity_stringSame result as quantity as a stringstring
timestampBlock time of the event in timestamp format (e.g., 2021-07-03T23:45:00Z)string
block_numberNumeric figure representing the block number within which the transfer occurredint
block_hashDigital fingerprint / hash of the specific block. This will be null for Solana NFTsstring / null
transactionUnique identifier of the relevant transactionstring
transaction_indexPosition of the transaction within the block. The may be null for earlier records, but log_index can be used instead of ordering within a block.int / null
transaction_initiatorWallet address that submitted the blockchain transaction, regardless of whether they are in the to_address or from_address field. This will be null for Solana, Flow, and Bitcoin NFTs.string / null
log_indexIndex of the log in the transaction event logsint
batch_transfer_indexIndex of the transfer in the log (Usually there is one transfer per log, but ERC-1155 allows for batch transfers in one log)int
sale_detailsDetails on the sale event that occurred in this transfer, if applicablesale_details / null
is_removed[For transfer webhooks only] - Indicates whether a transfer is removed due to a reorgbool/null

Sale & Mints Model

The SimpleHash API includes detail on the sale (and primary sales / mints) of NFTs inline within the response bodies of both the NFT and transfer models. Currently NFT sale information will be returned for sales that occurred on the marketplaces and chains shown here:

  • Ethereum: OpenSea, Blur, Magic Eden, LooksRare, X2Y2, CryptoPunks
  • Solana: Magic Eden, Tensor
  • Bitcoin: Magic Eden
  • Polygon: OpenSea (Seaport contract), Magic Eden
  • Arbitrum: OpenSea, Stratos, Trove
  • Arbitrum Nova: OpenSea
  • Avalanche: OpenSea
  • Base: OpenSea, Magic Eden
  • Blast: OpenSea, Blur
  • BSC: OpenSea
  • Optimism: OpenSea, Quix
  • Zora: OpenSea
  • Ethereum Goerli: OpenSea
  • Ethereum Sepolia: OpenSea
  • Arbitrum Goerli: OpenSea
  • Arbitrum Sepolia: OpenSea
  • Avalanche Fuji: OpenSea
  • Base Goerli: OpenSea
  • Base Sepolia: OpenSea
  • Blast Sepolia: OpenSea
  • BSC Testnet: OpenSea
  • Optimism Goerli: OpenSea
  • Optimism Sepolia: OpenSea
  • Polygon Mumbai: OpenSea
  • Zora Sepolia: OpenSea
  • Zora Testnet: OpenSea

We now also support primary sales on all EVM chains & testnets. This is the amount paid during the mint transaction.

Coverage of more chains and marketplaces will be added in the near future.

On NFT responses, sale information is included in the field named last_sale, whereas in transfer responses, it is included in the field named sale_details

last_sale and primary_sale models (included inline with the NFT model):

FieldDescriptionType(s)
from_addressAddress selling the NFTstring / null
to_addressAddress acquiring the NFTstring / null
quantityThe quantity of the NFT being sold. For semi-fungibles (like ERC-1155), this quantity may be greater than 1int
quantity_stringSame results as quantity as a stringstring
timestampDatetime of the NFT salestring
transactionUnique identifier of the NFT sale transactionstring
marketplace_idID of the marketplace the sale occurred on (e.g. opensea)string
marketplace_nameName of the marketplace the sale occurred on (e.g., OpenSea)string
is_bundle_saleWhether the sale was a bundle sale or not (a bundle sale is where several items are put up for sale on a marketplace at a single price)boolean
payment_tokenDetail on the token used to make the NFT sale. Will be null if is_bundle_sale is truepayment_token / null
unit_priceIndividual unit price of an item within the NFT sale. Will be null if is_bundle_sale is trueint / null
total_priceTotal price of the NFT sale. Will be null if is_bundle_sale is trueint / null
unit_price_usd_centsIndividual price of an item within the NFT sale, in USD cents, as calculated at the time of the transaction. Will be null if is_bundle_sale is true or the currency conversion rate was unknownint / null

sale_details model (included inline with the transfer model):

FieldDescriptionType(s)
marketplace_idID of the marketplace the sale occurred on (e.g. opensea)string / null
marketplace_nameName of the marketplace the sale occured on (e.g., OpenSea)string
is_bundle_saleWhether the sale was a bundle sale or not (a bundle sale is where several items are put up for sale on a marketplace at a single price)boolean
payment_tokenDetail on the token used to make the NFT sale. Will be null if is_bundle_sale is truepayment_token / null
unit_priceIndividual unit price of an item within the NFT sale. Will be null if is_bundle_sale is trueint / null
total_priceTotal price of the NFT sale. Will be null if is_bundle_sale is trueint / null
unit_price_usd_centsIndividual price of an item within the NFT sale, in USD cents, as calculated at the time of the transaction. Will be null if is_bundle_sale is true or the currency conversion rate was unknownint / null

payment_token model:

FieldDescriptionType(s)
payment_token_idUnique identifier of the token type used to make the sale. Currently for ethereum ecosystem sales, this may be ethereum.native for the native ETH token, or ethereum.{contract_address} for ERC-20 tokensstring
nameName of the token, e.g., Ether derived from the contract or otherwisestring / null
symbolSymbol of the token derived from the contract or otherwise, e.g., ETHstring / null
addressContract address of the ERC-20 token used to make the sale (null in the case of the native ETH token)string / null
decimalsBase number of decimals of the token value involved in the NFT sale (e.g., 18 in the case of the native ETH token)int

Listing Models

The SimpleHash API includes details of active and historical listings on NFT marketplaces.

  • UniSat: Live (Bitcoin Ordinals)
  • OKX: Live (Bitcoin Ordinals)
  • Blur: Live
  • OpenSea: Live (all chains)
  • MagicEden Live (Bitcoin Ordinals, Solana, Polygon, Ethereum & Base)
  • Tensor: Live
  • CryptoPunks: Live
  • LooksRare: Live
  • X2Y2: Live

Coverage of more marketplaces will be added in the near future.

listing model:

FieldDescriptionType(s)
idUnique identifier of the listingstring
permalinkLink to the marketplace listingstring
bundle_item_numberIf the listing is part of a bundle, the NFT's position in the bundleint / null
listing_timestampDatetime of the listingstring
expiration_timestampExpiration datetime of the listingstring / null
seller_addressOwner wallet addressstring
auction_typeAuction type, if applicable. Possible values are: dutch(AKA decreasing price auction)string / null
quantityOriginal listing quantityint
quantity_remainingRemaining listing quantityint
priceTotal price of the listingint
marketplace_idUnique identifier of the NFT marketplace associated with the listingstring
order_hashUnique marketplace-assigned identifier for the listingstring / null
collection_idUnique identifier for a specific collectionstring / null
nft_idUnique identifier for an NFT (chain.contract_address.token_id for EVM chains & Flow, chain.mint_address for Solana)string
payment_tokenDetail on the token used for the listingpayment_token / null

listing_event model:

FieldDescriptionType(s)
idUnique identifier of the listing eventstring
event_typeGeneric type of event, one of: listing_added, listing_modified, listing_removedstring
event_reasonMore detailed reason (if available); one of: listing_cancelled, listing_expired, ownership_changed, quantity_changed, price_changed

This list may expand as we add marketplaces that have their own idiosyncrasies.
string / null
event_timestampDatetime of the event as processed by SimpleHash. For additional on-chain times, refer to listing_timestamp and expiration_timestamp on the listing objectstring
listing_idUnique identifier of the listing from the listing modelstring
...(Additional fields from the listing model)

payment_token model:

FieldDescriptionType(s)
payment_token_idUnique identifier of the token type relevant to the collection. Currently for ethereum ecosystem sales, this may be ethereum.native for the native ETH token, or ethereum.{contract_address} for ERC-20 tokensstring
nameName of the token, e.g., Ether derived from the contract or otherwisestring / null
symbolSymbol of the token derived from the contract or otherwise, e.g., ETHstring / null
addressContract address of the ERC-20 token associated with the collection (null in the case of the native ETH token)string / null
decimalsBase number of decimals of the token value associated with the collection (e.g., 18 in the case of the native ETH token)int

Floor Price Models

A floor price is the lowest currently listed price of an NFT for a given NFT (often specific to an NFT marketplace).

The SimpleHash API includes detail on the floor price of NFT collections on the following chains with standardized currencies across collections:

  • Ethereum: ETH
  • Solana: SOL
  • Bitcoin: BTC
  • Polygon: wETH
  • Arbitrum: ETH
  • Optimism: ETH
  • Avalanche: AVAX
  • BSC: BNB
  • Base: ETH
  • Zora: ETH
  • Blast: ETH
  • Sei: SEI

Floor prices from the following marketplaces are included: CryptoPunks, Tensor, Blur, OpenSea, X2Y2, LooksRare, Magic Eden, OKX, UniSat, and MRKT

Please note that marketplaces such as LooksRare and Blur may display the "global floor price", which is the floor price across several marketplaces. You may need to mouse-over the value, or click in to the collection, in order to see the marketplace-specific floor price.

Coverage of more chains and marketplaces will be added in the near future.

The floor prices array can be found on the field named floor_prices on the collection model on the "NFT by..." endpoints, and directly on the the Collections by Wallet endpoint.

floor_price model:

FieldDescriptionType(s)
marketplace_idUnique identifier of the NFT marketplace associated with the floor pricestring
valueThe value of the floor price in the relevant currency. null if there is no current floor price (no active listings)int/null
payment_tokenDetail on the relevant currencypayment_token
value_usd_centsThe value of the floor price in USD centsint / null

payment_token model:

FieldDescriptionType(s)
payment_token_idUnique identifier of the token type relevant to the collection. Currently for ethereum ecosystem sales, this may be ethereum.native for the native ETH token, or ethereum.{contract_address} for ERC-20 tokensstring
nameName of the token, e.g., Ether derived from the contract or otherwisestring / null
symbolSymbol of the token derived from the contract or otherwise, e.g., ETHstring / null
addressContract address of the ERC-20 token associated with the collection (null in the case of the native ETH token)string / null
decimalsBase number of decimals of the token value associated with the collection (e.g., 18 in the case of the native ETH token)int

Bid models

Currently, SimpleHash provides access to bids and top bids. The top bid is the highest current offer, or bid, for any NFT within a collection.

The SimpleHash API includes details of active bids on the following NFT marketplaces.

  • OpenSea
  • Magic Eden

Bid model

FieldDescriptionType(s)
idUnique identifier of the bidstring
quantityBid quantityint/null
priceBid priceint
timestampDatetime of the bidstring
bidder_addressBidder addressstring
marketplace_idUnique identifier of the NFT marketplace associated with the bidstring
collection_idUnique identifier for a specific collectionstring / null
nft_idUnique identifier for an NFT (chain.contract_address.token_id for EVM chains & Flow, chain.mint_address for Solana)string
payment_tokenDetail on the token used for the bidpayment_token / null
expiration_timestampExpiration timestamp of the bidstring / null

The SimpleHash API includes top (collection-level) bids from the following marketplaces:

  • Blur
  • OpenSea

Coverage of additional marketplaces and bid types will be added in the near future.

The top bids array can be found on the field named top_bids on the collection model on the "NFT by..." endpoints, and directly on the the Collections by Wallet endpoint.

top_bids model:

FieldDescriptionType(s)
marketplace_idUnique identifier of the NFT marketplace associated with the top bidstring
valueThe value of the top bid in the relevant currencyint/null
payment_tokenDetail on the relevant currencypayment_token
value_usd_centsThe value of the top bid in USD centsint/ null

payment_token model:

FieldDescriptionType(s)
payment_token_idUnique identifier of the token type relevant to the collection. Currently for ethereum ecosystem sales, this may be ethereum.native for the native ETH token, or ethereum.{contract_address} for ERC-20 tokensstring
nameName of the token, e.g., Ether derived from the contract or otherwisestring / null
symbolSymbol of the token derived from the contract or otherwise, e.g., ETHstring / null
addressContract address of the ERC-20 token associated with the collection (null in the case of the native ETH token)string / null
decimalsBase number of decimals of the token value associated with the collection (e.g., 18 in the case of the native ETH token)int

Rarity Model

The SimpleHash API leverages the OpenRarity standard to calculate consistent, mathematically-grounded rarity score for NFTs.

Currently, ERC-721 and Metaplex non-fungible token standards are supported. Support for ERC-1155 is expected soon.

rarity model:

FieldDescriptionType(s)
rankRarity rank, relative to the scores of all other NFTs in the collectionint / null
scoreRaw rarity scorefloat / null
unique_attributesThe number of unique attributes, or traits, if any, that this NFT possessesint / null

Spam Scores

Overview

  • Spam NFTs have become a significant issue as NFT use and adoption has risen
  • This leads to poor UX, especially in wallet and dapp use cases, with end users often being confused or annoyed as to why unfamiliar, low quality NFTs appear
  • An even greater concern is when these NFTs, which are usually airdropped en-masse, contain malicious links to dangerous external sites or resources
  • Spam NFTs have been proliferating quicker on popular networks with lower transaction fees or costs, most notably Polygon and Solana

Spam scores are currently available to customers on Enterprise plans, on the main EVM chains, Solana and Bitcoin Ordinals.

Goals

The SimpleHash spam scoring implementation has two main goals:

  1. Make it easier to identify low-quality NFTs from undesirable airdrops (”spam NFTs”)
  2. Make it easier to identify NFTs that have dangerous or malicious external links (”scam NFTs”)

There is a blurred boundary between these two types of NFTs, and those targeted in the current implementation may fit into both categories.

SimpleHash Spam Scoring - Overview of Approach

  • In an effort to provide end users with more tools to combat spam NFTs, the SimpleHash NFT provides a spam score for almost all NFT collections
  • This model is generated through a combination of analytics and heuristics, plus an LLM that we continually finetune for this purpose - read more about our approach here: https://simplehash.com/blog/how-simplehash-fights-nft-spam-using-ai-and-crowdsourcing
  • The model also utilizes OCR to assess the media of the image
  • External links and description fields are also checked for malicious URLs and drainers
  • The score is a numeric value from 0 to 100, with 0 being deemed not spam, and 100 being deemed likely spam
  • The field spam_score is provided inline with NFT response bodies on the API, within the collection field (example pictured):
  • Currently, the spam scores are generated at the NFT collection level, meaning all NFTs on a given collection with have the same score
  • If the response is null, the collection does not have sufficient information to be scored, or has not yet been assessed