3mint
  • 👋Welcome to 3mint
  • 💻3mint Platform
    • Introduction
    • Deploy a contract
    • Upload your NFT data
    • Create checkout links
    • Add customers
    • Monitor your links
  • ⌨️Developer Guides
    • Introduction
    • Contracts
      • Contract Architecture
      • End-to-end Example
    • Mint
      • How To
      • End-to-end Example
      • Code Snippets
    • Wallets
      • End-to-end Example
      • Mobile Pass
        • Creating Passes
    • Token Gating
      • End-to-end Example
      • Code Snippets
  • 📖API Reference
    • Overview
    • Contracts
      • Deploy Contract
      • Get Contract
    • Collectibles
      • Get All Templates
      • Mint Collectible
    • Wallets
      • Create Wallet
      • Get Wallet
    • Customers
      • Create Customer
      • Get Customer
      • Delete Customer
    • Claim Links
      • Create Link
      • Update Link
    • Token Gating
      • Create Gate
  • ❓FAQ
    • Web3 101
    • Platform
Powered by GitBook
On this page
  • NFT Ownership
  • User owns 2 ERC721 NFTs
  • User owns at least 1 ERC1155 with a specific token ID
  • User owns multiple ERC721 NFTs from different collections
  • User owns 1 ERC721 NFT for at least 6 months and 10 days
  • User owns 1 ERC721 NFT since the beginning of 2022
  • User owns 1 ERC721 NFT with specific metadata attributes
  • Token Ownership
  • Address owns at least 2 WETH
  • Address has held at least 2 WETH for 30 days
  • Coin Ownership
  • Address owns at least 2.5 ETH
  • Combos
  • User owns 5 ETH or 2 WETH plus 1 to 4 ERC721 NFTs
  1. Developer Guides
  2. Token Gating

Code Snippets

Different ways to token gate

SDK Coming Soon

With the release of our SDK, you'll be able to easily integrate all features within your framework of choice.

Demo API key

You can test the token gating API endpoint using "demo" as the API key. This will work for test networks and is rate limited. This cannot yet be used for airdrop and wallets APIs.

NFT Ownership

User owns 2 ERC721 NFTs

This example verifies that an address holds exactly 2 NFTs from the Bored Ape Yacht Club collection.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "erc721",
               "contractAddress": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
               "minBalance": 2,
               "maxBalance": 2
           }
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc721',
            'contractAddress': '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D',
            'minBalance': 2,
            'maxBalance': 2
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));

User owns at least 1 ERC1155 with a specific token ID

This example verifies that an address holds at least one NFT from the Crypto Baristas collection.

Since the smart contracts that OpenSea and Rarible provide have thousands of different NFT projects listed on them, the only way to accurately token gate something is by including the different IDs that a user should own.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "erc1155",
                "contractAddress": "0xf6793da657495ffeff9ee6350824910abc21356c",
                "tokenIds": [
                    9720425186420365222353899819497168751076639606951250294350818944954633551881,
                    9720425186420365222353899819497168751076639606951250294350818944954633551883,
                    9720425186420365222353899819497168751076639606951250294350818944954633551885,
                    ...
                ],
                "minBalance": 1
            }
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc1155',
            'contractAddress': '0xf6793da657495ffeff9ee6350824910abc21356c',
            'tokenIds': [
                9720425186420365222353899819497168751076639606951250294350818944954633551881,
                9720425186420365222353899819497168751076639606951250294350818944954633551883,
                9720425186420365222353899819497168751076639606951250294350818944954633551885,
                ...
            ],
            'minBalance': 1
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));

User owns multiple ERC721 NFTs from different collections

This example verifies that an address holds at least 1 Bored Ape and two ApeDocs NFT.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
                "type": "erc721",
                "contractAddress": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
                "minBalance": 1
            },
            {
                "logic": "and",
                "type": "erc721",
                "contractAddress": "0x552a43cb61bc127d81b1f280bc39f62e5a51c0c2",
                "minBalance": 2
            }
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
          'type': 'erc721',
          'contractAddress': '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D',
          'minBalance': 1
          },
          {
          'logic': 'and',
          'type': 'erc721',
          'contractAddress': '0x552a43cb61bc127d81b1f280bc39f62e5a51c0c2',
          'minBalance': 2
          },
       ]
    }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));

User owns 1 ERC721 NFT for at least 6 months and 10 days

You cannot have both minTime and minBalance parameters set in the same object request.

This example verifies that an address has held 1 NFT from the Bored Ape Yacht Club collection for at least 6 months and 10 days.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "contractType": "erc721",
               "contractAddress": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
               "minBalance": 1,
               "minTime": "0.6.10.0.0" //format: "years.months.days.hours.minutes"
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'contractType': 'erc721',
            'contractAddress': '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D',
            'minBalance': 1,
            'minTime': '0.6.10.0.0' //format: 'years.months.days.hours.minutes'
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));

User owns 1 ERC721 NFT since the beginning of 2022

minTimestamp must follow format in example below (e.g., 2014-09-08T08:02:17.160Z)

This example verifies that an address has held 1 NFT from the Bored Ape Yacht Club collection since the beginning of 2022.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "erc721",
               "contractAddress": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
               "minBalance": 1,
               "minTimestamp": "2022-01-01T00:00:00.000Z"
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc721',
            'contractAddress': '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D',
            'minBalance': 1,
            'minTimestamp': '2022-01-01T00:00:00.000Z'
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));

User owns 1 ERC721 NFT with specific metadata attributes

This example verifies that an address holds at least 1 Crypto Punk with two attribute types.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
                "type": "erc721",
                "contractAddress": "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D",
                "minBalance": 1,
                "attributes": [
                    {
                        "traitType": "Type",
                        "value": "Female 2"
                    },
                    {
                        "traitType": "Attribute",
                        "value": "Wild Blonde"
                    }
                ],
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc721',
            'contractAddress': '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D',
            'minBalance': 1,
            'attributes': [
                {
                    'traitType': 'Type',
                    'value': 'Female 2'
                },
                {
                    'traitType': 'Attribute',
                    'value': 'Wild Blonde'
                }
            ],
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));javascr

Token Ownership

Token balance amounts can include decimals.

Address owns at least 2 WETH

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "erc20",
               "contractAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
               "minBalance": 2
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc20',
            'contractAddress': '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
            'minBalance': 2
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));javascr

Address has held at least 2 WETH for 30 days

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "erc20",
               "contractAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
               "minBalance": 2,
               "minTime": "0.0.30.0.0"
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'erc20',
            'contractAddress': '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
            'minBalance': 2,
            'minTime': '0.0.30.0.0'
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));javascr

Coin Ownership

Coin balance amounts can include decimals.

Address owns at least 2.5 ETH

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
           {
               "type": "coin",
               "chain": "ethereum"
               "network": "mainnet",
               "minBalance": 2.5
            },
         ] 
       }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'coin',
            'minBalance': 2.5,
        },
     ]
   }
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));javascr

Combos

Combos can be deeply nested (i.e., you can have a combo within a combo). This allows you to do complex token gating mechanisms, like:

if ((A and B) or (C and (D or E))), then...

User owns 5 ETH or 2 WETH plus 1 to 4 ERC721 NFTs

This example verifies that an address holds at least 5 ETH or 2 WETH and 1 to 4 ApeDocs NFTs.

curl -X POST https://api.3mint.io/api/v1/tokenGate   
   -H "Content-Type: application/json"
   -H "X-API-KEY: [YOUR_API_KEY]"
   -d '{"walletAddress": "0x958fb436dB50DB2F689C364712113cc226b38151",
       "chain": "ethereum",
       "network": "mainnet",
       "requirements": [
            {
                "type": "coin",
                "minBalance": 5
            },
            {
                "logic": "or",
                "type": "combo",
                "requirements": [
                    {
                        "type": "erc20",
                        "contractAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
                        "minBalance": 2
                    },
                    {
                        "logic": "and",
                        "type": "erc721",
                        "contractAddress": "0x552a43cb61bc127d81b1f280bc39f62e5a51c0c2",
                        "minBalance": 1,
                        "maxBalance": 4
                    }
                ]
            }
        ]
   }'
import axios from 'axios';

// replace with your 3mint api key
const apiKey = 'demo';
const url = 'https://api.3mint.io/api/v1/tokenGate';

var requestOptions = {
  method: 'POST',
  url: `${url}`,
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': `${apiKey}`
  },
  data: {
    'walletAddress': '0x958fb436dB50DB2F689C364712113cc226b38151',
    'chain': 'ethereum',
    'network': 'mainnet',
    'requirements': [
         {
            'type': 'coin',
            'minBalance': 5
        },
        {
            'logic': 'or',
            'type': 'combo',
            'requirements': [
                {
                    'type': 'erc20',
                    'contractAddress': '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
                    'minBalance': 2
                },
                {
                    'logic': 'and',
                    'type': 'erc721',
                    'contractAddress': '0x552a43cb61bc127d81b1f280bc39f62e5a51c0c2',
                    'minBalance': 1,
                    'maxBalance': 4
                }
            ]
        },
     ]
  } 
};

axios(config)
.then(response => console.log(response))
.catch(error => console.log(error));javascr
PreviousEnd-to-end ExampleNextOverview

Last updated 2 years ago

⌨️