Skip to main content

Overview

This guide covers reading NFTs and digital collectibles with the Helius Digital Asset Standard (DAS) API: fetching a single asset, listing a wallet’s NFTs, querying by collection or creator, working with compressed NFTs and Merkle proofs, listing editions, and reading transaction history. For fungible tokens — balances, supply, holders, and prices — see the Get SPL Tokens guide. The same getAsset and getAssetsByOwner methods serve both NFTs and tokens; this page focuses on the NFT and collectible workflows.

When to use this

Use the methods on this page when you are:
  • Displaying a single NFT’s metadata, image, and attributes
  • Listing every NFT a wallet owns for a portfolio or gallery
  • Powering a marketplace or explorer with collection and creator queries
  • Verifying or transferring compressed NFTs (which require Merkle proofs)
  • Showing an NFT’s on-chain transaction history
  • Listing the editions printed from a master NFT

NFT methods

Start with getAsset for a single NFT or getAssetsByOwner for a wallet’s collection. Each card links to its full API reference.

getAsset

Full data for one NFT by its ID.

getAssetsByOwner

All NFTs held by a wallet.

searchAssets

Filter by collection, creator, attributes, and more — see the Search Assets guide.

getAssetsByCreator

All assets minted by a creator.

getAssetsByGroup

All assets in a collection.

getSignaturesForAsset

Transaction history for an asset.

getNftEditions

Editions printed from a master NFT.

getAssetProof

Merkle proof for a compressed NFT.

Fetch a single NFT

Retrieve full metadata, ownership, and collection data for one NFT by its ID:
const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getAsset',
    params: { id: 'F9Lw3ki3hJ7PF9HQXsBzoY8GyE6sPoEZZdXJBsTTD2rk' },
  }),
});

const { result } = await response.json();
console.log(result.content.metadata.name, result.ownership.owner);

More NFT queries

const getNFTsByOwner = async (ownerAddress) => {
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getAssetsByOwner',
      params: { ownerAddress, page: 1, limit: 10 },
    }),
  });

  const { result } = await response.json();
  return result;
};

getNFTsByOwner('86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY');
const getAssetsByCreator = async (creatorAddress) => {
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getAssetsByCreator',
      params: { creatorAddress, page: 1, limit: 100 },
    }),
  });

  const { result } = await response.json();
  return result;
};

getAssetsByCreator('9uBX3ASjxWvNBAD1xjbVaKA74mWGZys3RGSF7DdeDD3F');
const getAssetsByCollection = async (collectionAddress) => {
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getAssetsByGroup',
      params: { groupKey: 'collection', groupValue: collectionAddress, page: 1, limit: 100 },
    }),
  });

  const { result } = await response.json();
  return result;
};

getAssetsByCollection('J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w');
const getNFTTransactionHistory = async (mintAddress) => {
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getSignaturesForAsset',
      params: { id: mintAddress, page: 1, limit: 100 },
    }),
  });

  const { result } = await response.json();
  return result;
};

getNFTTransactionHistory('FNt6A9Mfnqbwc1tY7uwAguKQ1JcpBrxmhczDgbdJy5AC');

Compressed NFTs

State-compressed NFTs (cNFTs) are read with the same methods as regular NFTs — getAsset, getAssetsByOwner, and searchAssets all return them. Two things are specific to compression:
  • Merkle proofs — on-chain operations such as transfers and burns require a proof from getAssetProof.
  • History — use getSignaturesForAsset (shown above) for a cNFT’s transaction history.
const getProof = async (id) => {
  const response = await fetch('https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getAssetProof',
      params: { id },
    }),
  });

  const { result } = await response.json();
  return result; // { root, proof, node_index, leaf, tree_id }
};

getProof('Bu1DEKeawy7txbnCEJE4BU3BKLXaNAKCYcHR4XhndGss');

Best practices

  • Use pagination for methods that return large result sets.
  • Handle errors with try/catch and retry transient failures with exponential backoff.
  • Cache responses when appropriate to reduce API calls.
  • Use getAssetBatch instead of many single getAsset calls when you have multiple IDs.

Next steps

Get SPL Tokens

Fungible token balances, supply, holders, and prices.

Search Assets

Filter NFTs by collection, creator, and attributes.

DAS API FAQ

Common questions about assets, price data, and usage.