NFT Ownership API
The NFT Ownership API can be used to retrieve information about the ownership of a specific NFT ( Non-Fungible Token ) on the supported blockchain. For instance using this we can access the owners of an NFT including their addresses and associated metadata and also we can retrieve a list of the top holders of a particular NFT.
Get NFT Owners
This query fetches the most recent owner of the NFT. The API leverages the BalanceUpdates method, which keeps track of all balance updates. Alternatively, you can achieve similar results by utilizing the Transfers API.
query MyQuery {
EVM(dataset: combined, network: eth) {
BalanceUpdates(
orderBy: { descending: Block_Time }
limit: { count: 1 }
where: {
BalanceUpdate: { Id: { eq: "9996" } }
Currency: {
Fungible: false
SmartContract: { is: "0x8a90cab2b38dba80c64b7734e58ee1db38b8992e" }
}
}
) {
Currency {
Name
SmartContract
}
BalanceUpdate {
Address
Amount
Id
}
Block {
Number
Date
}
}
}
}
Parameters
network
: This specifies the Ethereum network to use.dataset
: This specifies the dataset to use. In this case, the dataset is combined.limit
: Specifies the maximum results to return. In this query, the limit is 1.orderBy
: Results are in descending order by Block_Time.where
: This parameter allows you to filter the results based on specific conditions. In this case, the token ID is "9996" and the Currency is non-fungible, with the Smart Contract being0x8a90cab2b38dba80c64b7734e58ee1db38b8992e
.
Returned Data
Currency
: Specifies the NFT currency.Name
represents the currency name, andSmartContract
contains its smart contract address.BalanceUpdate
: Contains the address of the NFT holder, along with the amount and ID of the token involved in the balance update.Block
: Includes the block number and date.
You can find the graphql query here.
Top Holders of an NFT
Let's see an example showcasing the retrieval of the top 10 holders for a particular NFT, with their balances.
query MyQuery {
EVM(dataset: combined, network: eth) {
BalanceUpdates(
orderBy: { descendingByField: "Balance" }
limit: { count: 10 }
where: {
Currency: {
SmartContract: { is: "0x7dD4F223D9155F412790D696Fa30923489d4Ad34" }
}
}
) {
BalanceUpdate {
Address
}
Balance: sum(of: BalanceUpdate_Amount, selectWhere: { gt: "0" })
}
}
}
In this query, you'll need to replace 0x7dD4F223D9155F412790D696Fa30923489d4Ad34
with the contract address of the NFT you'd like to retrieve top holders for.
Parameters
dataset
: Specifies combined dataset that includes both realtime & archive data.network
: Specifies that the Ethereum network is being queried.orderBy
: Orders the results based on the "Balance" field in descending order, meaning the holder with highest balance will appear first.limit
: Limits the number of results returned to 10.where
: It filters the query results based on the NFT smart contract address0x7dD4F223D9155F412790D696Fa30923489d4Ad34
.Currency: {SmartContract: {is: ""}}
specifies the filter for the smart contract address.
Returned Data
Balance
: Specifies the balance amount in the results.BalanceUpdate
: TheAddress
field specifies the address who holds the NFT.
You can find the graphql query here.
Find NFT Creator Address
The creator of the NFT can be inferred from the sender of the first transfer.
By setting, Transfers(limit: {count: 1} orderBy: {ascending: Block_Time})
we fetch the earliest (first) transfer record based on block time.
You can run the query here
query MyQuery {
EVM(dataset: archive) {
Transfers(
limit: {count: 1}
orderBy: {ascending: Block_Time}
where: {Transfer: {Currency: {SmartContract: {is: "0xa7d8d9ef8D8Ce8992Df33D8b8CF4Aebabd5bD270"}}, Id: {eq: "78000725"}}}
) {
Block {
Time
}
Transfer {
Amount
Currency {
Symbol
SmartContract
ProtocolName
Native
Name
HasURI
Fungible
DelegatedTo
Delegated
Decimals
}
Data
Id
Receiver
Success
Type
}
}
}
}
Past (churned) holders of tokens
Check past (churned) token holders of a NFT token using following query.
{
EVM(dataset: combined) {
BalanceUpdates(
limit: {count: 10}
where: {Currency: {Fungible: false, SmartContract: {is: "0x364c828ee171616a39897688a831c2499ad972ec"}}}
) {
BalanceUpdate {
Address
}
Block {
lastHoldingDate: Time(
maximum: Block_Time
if: {Currency: {SmartContract: {is: "0x364c828ee171616a39897688a831c2499ad972ec"}}}
)
fistHoldingDate: Time(
minimum: Block_Time
if: {Currency: {SmartContract: {is: "0x364c828ee171616a39897688a831c2499ad972ec"}}}
)
}
sum(of: BalanceUpdate_Amount, selectWhere: {le: "0"})
}
}
}