Skip to main content

NFT Spam Detection

Our APIs automatically identify and filter potentially harmful or unwanted NFTs while giving you full control over the user experience.

Overview

NFT spam has become a significant problem in the ecosystem, with bad actors using airdrops to distribute scam NFTs, phishing attempts, and low-quality content. Our spam detection system analyzes multiple signals to identify problematic collections and provides flexible filtering options for developers.

Key Features:

  • Automatic spam detection with scores from 0-100
  • Default filtering to protect users by default
  • Flexible controls for custom filtering experiences
  • Real-time spam score updates

How Spam Detection Works

Our spam detection algorithm analyzes multiple signals to calculate a spam score between 0-100, where higher scores indicate a higher likelihood of spam.

Detection Criteria

We evaluate collections based on these key factors:

  1. Centralization of Ownership

    • Analyzes how distributed ownership is across wallets
    • Highly centralized collections often indicate artificial activity
  2. All-Time Volume

    • Examines historical trading volume and patterns
    • Legitimate collections typically show organic trading activity
  3. Unique Interactors

    • Counts the number of unique wallets that have interacted with the collection
    • Spam collections often have limited genuine user interaction
  4. Honey Pot Airdrops

    • Detects patterns consistent with malicious airdrop campaigns
    • Identifies collections used for phishing or scam attempts
  5. User Reporting

    • Incorporates community feedback and user reports
    • Helps identify new spam patterns quickly

Spam Score Calculation

  • Score Range: 0-100 (higher = more likely spam)
  • Threshold: Collections scoring >50 are considered spam

Using the Hidden Filter

The simplest way to handle spam is to use the hidden filter found the nftBalances portfolio endpoint. When hidden=false, NFTs that have been identified as spam will not be returned.

Basic Hidden Filter Usage

Try it nowArrow pointing right

Example Variables

{
"addresses": [
"0x52c8ff44260056f896e20d8a43610dd88f05701b"
],
"first": 10,
"order": {
"by": "LAST_RECEIVED"
},
"filters": {
"hidden": false // When false it will not return NFTs that have been indetified as spam
}
}

Showing Hidden/Spam NFTs

To show spam NFTs (for advanced users or debugging), set hidden: true:

{
"addresses": [
"0x52c8ff44260056f896e20d8a43610dd88f05701b"
],
"filters": {
"hidden": true // Returns only NFTs identified as spam
}
}
warning

Be cautious when showing spam NFTs to users, as they may contain malicious content or phishing attempts.

Checking Collection Spam Scores

For more granular control, you can query the spamScore of specific collections using the nftCollectionV2 endpoint.

Try it nowArrow pointing right

Example Variables

{
"input": {
"address": "0xce2830932889c7fb5e5206287c43554e673dcc88",
"chainId": 8453
}
}

Example Query

query SpamExample($input: NftCollectionInputV2) {
nftCollectionV2(input: $input) {
name
spamScore
address
networkV2 {
chainId
name
}
}
}

Example Response

{
"data": {
"nftCollectionV2": {
"name": "OK COMPUTERS",
"spamScore": "0",
"address": "0xce2830932889c7fb5e5206287c43554e673dcc88",
"networkV2": {
"chainId": 8453,
"name": "Base"
}
}
}
}

Including Spam Scores in Portfolio Responses

You can include spam scores directly in the nftBalances portfolio endpoint to build custom filtering experiences.

Example Query with Spam Scores

query NFTBalances_WithSpamScores($addresses: [Address!]!, $first: Int, $order: PortfolioV2NftBalanceByTokenInputInput) {
portfolioV2(addresses: $addresses) {
nftBalances {
totalBalanceUSD
totalTokensOwned
byToken(first: $first, order: $order) {
edges {
node {
lastReceived
token {
tokenId
name
description
supply
circulatingSupply
estimatedValue {
valueUsd
valueWithDenomination
denomination {
address
symbol
network
}
}
collection {
network
address
name
type
spamScore # Include spam score
deployer
deployedAt
owner
medias {
logo {
mimeType
fileSize
blurhash
height
width
originalUri
original
large
medium
thumbnail
predominantColor
}
}
}
}
}
}
}
}
}
}

Example Response with Spam Score

{
"data": {
"portfolioV2": {
"nftBalances": {
"totalBalanceUSD": 7330.6878496656,
"totalTokensOwned": "31134",
"byToken": {
"edges": [
{
"node": {
"lastReceived": 1734390407000,
"token": {
"tokenId": "11410",
"name": "Opepen 11410",
"description": "This artwork may or may not be handmade.",
"supply": "1",
"circulatingSupply": "1",
"estimatedValue": {
"valueUsd": 458.7449105987138,
"valueWithDenomination": 0.2543792169395613,
"denomination": {
"address": "0x0000000000000000000000000000000000000000",
"symbol": "ETH",
"network": "ethereum"
}
},
"collection": {
"network": "ETHEREUM_MAINNET",
"address": "0x6339e5e072086621540d0362c4e3cea0d643e114",
"name": "Opepen Edition",
"type": "GENERAL",
"spamScore": "0",
"deployer": "0xf74b146ce44cc162b601dec3be331784db111dc1",
"deployedAt": 1673205671000,
"owner": "0xc8f8e2f59dd95ff67c3d39109eca2e2a017d4c8a"
}
}
}
}
]
}
}
}
}
}

Custom Filtering Strategies

With access to spam scores, you can implement custom filtering strategies:

Custom Threshold

// Set a custom threshold
const userThreshold = 30; // User preference
const shouldShow = collection.spamScore <= userThreshold;

Graduated Display

// Show different UI based on spam score
if (collection.spamScore <= 50) {
// Display normally
} else if (collection.spamScore <= 75) {
// Display with warning
} else {
// Hide or show with strong warning
}

Best Practices

1. Default to Safety

Always use the default hidden: false filter unless users explicitly request to see spam NFTs.

// Good: Safe by default
const filters = { hidden: false };

// Risky: Showing all NFTs including spam
const filters = { hidden: true };

2. Provide User Control

For advanced users, consider providing spam score thresholds as a setting:

const userSettings = {
spamThreshold: 50, // User-defined comfort level
showWarnings: true // Show warnings for borderline NFTs
};

3. Monitor and Report

Help improve the system by reporting false positives or new spam patterns.

Learn more about the endpoints used in spam detection:

Summary

Our NFT spam detection system provides multiple layers of protection while maintaining flexibility for developers:

  • Automatic Protection: Default filtering keeps users safe
  • Granular Control: Spam scores allow custom filtering logic
  • Real-time Updates: Scores update as new data becomes available
  • User Choice: Let users decide their comfort level with spam

By leveraging these tools, you can create a safer, more enjoyable NFT experience for your users while maintaining the flexibility to handle edge cases and power user needs.