Features
Fetching Assets
Last updated January 31, 2026
This guide shows how to fetch Core Assets and Collections from the Solana blockchain using the Metaplex Core SDK. Retrieve individual Assets, query by owner or collection, or use DAS for indexed queries.
What You'll Learn
- Fetch a single Asset or Collection by address
- Query Assets by owner, collection, or update authority
- Use DAS (Digital Asset Standard) API for fast indexed queries
- Understand GPA vs DAS performance trade-offs
Summary
Fetch Core Assets and Collections using SDK helper functions or the DAS API. Choose the right method based on your use case:
- Single Asset/Collection: Use
fetchAsset()orfetchCollection()with the public key - Multiple Assets: Use
fetchAssetsByOwner(),fetchAssetsByCollection(), orfetchAssetsByUpdateAuthority() - DAS API: Use indexed queries for faster performance (requires DAS-enabled RPC)
Out of Scope
Token Metadata fetching (use mpl-token-metadata), compressed NFT fetching (use Bubblegum DAS extensions), and off-chain metadata fetching (fetch the URI directly).
Quick Start
Jump to: Single Asset · By Owner · By Collection · DAS API
- Install:
npm install @metaplex-foundation/mpl-core @metaplex-foundation/umi - Configure Umi with your RPC endpoint
- Call
fetchAsset(umi, publicKey)with the Asset address - Access Asset properties:
name,uri,owner,plugins
Prerequisites
- Umi configured with an RPC connection
- Asset/Collection address (public key) to fetch
- DAS-enabled RPC for indexed queries (optional but recommended)
Fetch a Single Asset or Collection
To fetch a single Asset the following function can be used:
1import { fetchAsset, fetchCollection, mplCore } from '@metaplex-foundation/mpl-core';
2import { publicKey } from '@metaplex-foundation/umi';
3import { createUmi } from '@metaplex-foundation/umi-bundle-defaults';
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Fetch a Core Asset
10const assetAddress = publicKey('AssetAddressHere...')
11const asset = await fetchAsset(umi, assetAddress)
12
13// Fetch a Core Collection
14const collectionAddress = publicKey('CollectionAddressHere...')
15const collection = await fetchCollection(umi, collectionAddress)
16
17console.log('Asset fetched:', asset)
18console.log('Name:', asset.name)
19console.log('Owner:', asset.owner)
20console.log('URI:', asset.uri)
21
22console.log('\nCollection fetched:', collection)
23console.log('Name:', collection.name)
24console.log('URI:', collection.uri)
Fetch a Core Collection
import { fetchCollection } from '@metaplex-foundation/mpl-core'
const asset = await fetchCollection(umi, collection.publicKey, {
skipDerivePlugins: false,
})
console.log(asset)
Fetch Multiple Assets
Multiple Assets can either be fetched using a getProgramAccounts (GPA) call, which can be quite expensive and slow RPC wise, or using the Digital Asset Standard API, which is faster but requires specific RPC providers.
Fetch Assets By Owner
fetch Assets by Owner
import { publicKey } from '@metaplex-foundation/umi'
import { fetchAssetsByOwner } from '@metaplex-foundation/mpl-core'
const owner = publicKey('11111111111111111111111111111111')
const assetsByOwner = await fetchAssetsByOwner(umi, owner, {
skipDerivePlugins: false,
})
console.log(assetsByOwner)
Fetch Assets by Collection
Fetch Assets by Collection
import { publicKey } from '@metaplex-foundation/umi'
import { fetchAssetsByCollection } from '@metaplex-foundation/mpl-core'
const collection = publicKey('11111111111111111111111111111111')
const assetsByCollection = await fetchAssetsByCollection(umi, collection, {
skipDerivePlugins: false,
})
console.log(assetsByCollection)
Fetch Assets by Update Authority
To fetch a single Asset the following function can be used:
Fetch a single asset
import { publicKey } from '@metaplex-foundation/umi'
import { fetchAssetsByUpdateAuthority } from '@metaplex-foundation/mpl-core'
const updateAuthority = publicKey('11111111111111111111111111111111')
const assetsByUpdateAuthority = await fetchAssetsByUpdateAuthority(
umi,
updateAuthority,
{ skipDerivePlugins: false }
)
console.log(assetsByUpdateAuthority)
DAS - Digital Asset Standard API
If you use a DAS enabled RPC you'll be able to take advantage of indexed Assets for lighting fast fetches and data retrieval. DAS will index everything from metadata, off chain metadata, collection data, plugins (including Attributes), and more. To learn more about the Metaplex DAS API you can click here. In addition to the general DAS SDK an extension for MPL Core has been created that directly returns you the correct types to further use with the MPL Core SDKs. It also automatically derives the plugins in assets inherited from the collection and provides functions for DAS-to-Core type conversions. Below is an example of returned data from fetching a MPL Core Asset with DAS.
FetchAsset Example
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"authorities": [
{
"address": "Gi47RpRmg3wGsRRzFvcmyXHkELHznpx6DxEELGWBRWoC",
"scopes": ["full"]
}
],
"burnt": false,
"compression": {
"asset_hash": "",
"compressed": false,
"creator_hash": "",
"data_hash": "",
"eligible": false,
"leaf_id": 0,
"seq": 0,
"tree": ""
},
"content": {
"$schema": "https://schema.metaplex.com/nft1.0.json",
"files": [],
"json_uri": "https://example.com/asset",
"links": {},
"metadata": {
"name": "Test Asset",
"symbol": ""
}
},
"creators": [],
"grouping": [
{
"group_key": "collection",
"group_value": "8MPNmg4nyMGKdStSxbo2r2aoQGWz1pdjtYnQEt1kA2V7"
}
],
"id": "99A5ZcoaRSTGRigMpeu1u4wdgQsv6NgTDs5DR2Ug9TCQ",
"interface": "MplCore",
"mutable": true,
"ownership": {
"delegate": null,
"delegated": false,
"frozen": false,
"owner": "Gi47RpRmg3wGsRRzFvcmyXHkELHznpx6DxEELGWBRWoC",
"ownership_model": "single"
},
"plugins": {
"FreezeDelegate": {
"authority": {
"Pubkey": {
"address": "Gi47RpRmg3wGsRRzFvcmyXHkELHznpx6DxEELGWBRWoC"
}
},
"data": {
"frozen": false
},
"index": 0,
"offset": 119
}
},
"royalty": {
"basis_points": 0,
"locked": false,
"percent": 0,
"primary_sale_happened": false,
"royalty_model": "creators",
"target": null
},
"supply": null,
"unknown_plugins": [
{
"authority": {
"Pubkey": {
"address": "Gi47RpRmg3wGsRRzFvcmyXHkELHznpx6DxEELGWBRWoC"
}
},
"data": "CQA=",
"index": 1,
"offset": 121,
"type": 9
}
]
}
}
Common Errors
Asset not found
The public key doesn't point to a valid Core Asset. Verify:
- The address is correct and on the expected network (devnet vs mainnet)
- The account exists and is a Core Asset (not Token Metadata)
RPC rate limit exceeded
GPA queries can be expensive. Solutions:
- Use a DAS-enabled RPC for indexed queries
- Add pagination to limit results
- Cache results where appropriate
Notes
fetchAssetreturns the full Asset including derived plugins from the Collection- Set
skipDerivePlugins: trueto fetch only Asset-level plugins (faster) - GPA queries (
fetchAssetsByOwner, etc.) can be slow on mainnet - prefer DAS - DAS returns off-chain metadata; SDK fetch functions return on-chain data only
Quick Reference
Fetch Functions
| Function | Use Case |
|---|---|
fetchAsset(umi, publicKey) | Single Asset by address |
fetchCollection(umi, publicKey) | Single Collection by address |
fetchAssetsByOwner(umi, owner) | All Assets owned by a wallet |
fetchAssetsByCollection(umi, collection) | All Assets in a Collection |
fetchAssetsByUpdateAuthority(umi, authority) | All Assets by update authority |
DAS vs GPA Comparison
| Feature | GPA (getProgramAccounts) | DAS API |
|---|---|---|
| Speed | Slow (scans all accounts) | Fast (indexed) |
| RPC Load | High | Low |
| Off-chain Metadata | No | Yes |
| Requires Special RPC | No | Yes |
FAQ
Should I use GPA or DAS for fetching multiple Assets?
Use DAS whenever possible. GPA queries scan all program accounts and can be slow and expensive on mainnet. DAS provides indexed queries that are faster and include off-chain metadata. See DAS RPC providers for compatible endpoints.
How do I fetch an Asset's off-chain metadata?
The uri field contains the metadata URL. Fetch it separately:
const asset = await fetchAsset(umi, assetAddress)
const metadata = await fetch(asset.uri).then(res => res.json())
Can I fetch Assets across multiple Collections?
Not in a single query. Fetch each Collection's Assets separately and combine the results, or use DAS with custom filters.
Why is skipDerivePlugins useful?
By default, fetchAsset derives Collection-level plugins onto the Asset. Setting skipDerivePlugins: true skips this step, returning only Asset-level plugins. Use this when you only need the Asset's own plugins or want faster fetches.
How do I paginate large result sets?
GPA functions don't support built-in pagination. For large collections, use DAS which supports page and limit parameters, or implement client-side pagination.
Glossary
| Term | Definition |
|---|---|
| GPA | getProgramAccounts - Solana RPC method to query all accounts owned by a program |
| DAS | Digital Asset Standard - Indexed API for fast asset queries |
| Derived Plugin | A plugin inherited from the Collection onto an Asset |
| skipDerivePlugins | Option to skip Collection plugin derivation during fetch |
| Off-chain Metadata | JSON data stored at the Asset's URI (name, image, attributes) |
| On-chain Data | Data stored directly in the Solana account (owner, plugins, URI) |
