Features
Updating Assets
Last updated January 31, 2026
This guide shows how to update Core Asset metadata on Solana using the Metaplex Core SDK. Modify the name, URI, or collection membership of Assets you control.
What You'll Learn
- Update Asset name and metadata URI
- Move an Asset to a different Collection
- Make an Asset immutable (permanent)
- Understand update authority requirements
Summary
Update a Core Asset's metadata using the update instruction. Only the update authority (or an authorized delegate) can modify an Asset.
- Change
nameandurito update metadata - Use
newCollectionto move Assets between Collections - Set
updateAuthoritytoNoneto make immutable - Updates are free (no rent cost) unless changing account size
Out of Scope
Updating Token Metadata NFTs (use mpl-token-metadata), plugin modifications (see Plugins), and ownership transfers (see Transferring Assets).
Quick Start
Jump to: Update Asset · Change Collection · Make Immutable
- Install:
npm install @metaplex-foundation/mpl-core @metaplex-foundation/umi - Fetch the Asset to get current state
- Call
update(umi, { asset, name, uri })with new values - Verify changes with
fetchAsset()
Prerequisites
- Umi configured with a signer that is the Asset's update authority
- Asset address of the Asset to update
- New metadata uploaded to Arweave/IPFS (if changing URI) The update authority or delegate of a Core Asset has the ability to change some of the Asset's data.
Updating a Core Asset
Here is how you can use our SDKs to update an MPL Core Asset.
1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { update } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4import { publicKey } from '@metaplex-foundation/umi'
5
6const umi = createUmi('https://api.devnet.solana.com').use(mplCore())
7const assetAddress = publicKey('AssetAddressHere...')
8
9// Update an existing NFT asset's metadata
10const result = await update(umi, {
11 asset: assetAddress,
12 name: 'Updated NFT Name',
13 uri: 'https://updated-example.com/metadata.json',
14}).sendAndConfirm(umi)
15
16console.log('Asset updated successfully')
Change the Collection of a Core Asset
Here is how you can use our SDKs to change the collection of a Core Asset.
Change the collection of a Core Asset
import { publicKey } from "@metaplex-foundation/umi";
import {
update,
fetchAsset,
fetchCollection,
collectionAddress,
updateAuthority
} from "@metaplex-foundation/mpl-core";
const assetId = publicKey("11111111111111111111111111111111");
const asset = await fetchAsset(umi, assetId);
const collectionId = collectionAddress(asset)
if (!collectionId) {
console.log("Collection not found");
return;
}
const collection = await fetchCollection(umi, collectionId);
const newCollectionId = publicKey("22222222222222222222222222222222")
const updateTx = await update(umi, {
asset,
collection,
newCollection: newCollectionId,
newUpdateAuthority: updateAuthority('Collection', [newCollectionId]),
}).sendAndConfirm(umi);
Making a Core Asset Data Immutable
Here is how you can use our SDKs to make a Core Asset fully immutable. Be aware that there are different levels of immutability described in the immutability Guide.
Important
This is a destructive action and will remove the ability to update the asset. It will also remove the asset from any collections it was in. To make collection assets immutable you will need to change the update authority of the collection.
Make a Core Asset Immutable
import { publicKey } from '@metaplex-foundation/umi'
import { update, fetchAsset } from '@metaplex-foundation/mpl-core'
const assetId = publicKey('11111111111111111111111111111111')
const asset = await fetchAsset(umi, asset)
await update(umi, {
asset: asset,
newUpdateAuthority: updateAuthority('None'),
}).sendAndConfirm(umi)
Common Errors
Authority mismatch
You're not the update authority of the Asset. Check:
const asset = await fetchAsset(umi, assetAddress)
console.log(asset.updateAuthority) // Must match your signer
Collection authority required
When changing Collections, you need authority on both the Asset and the target Collection.
Asset is immutable
The Asset's update authority is set to None. This cannot be reversed.
Notes
- Fetch the Asset before updating to ensure you have the current state
- Only the update authority (or delegate) can update an Asset
- Making an Asset immutable is permanent and irreversible
- Changing Collections may affect inherited plugins (royalties, etc.)
- Updates don't change the Asset's owner
Quick Reference
Update Parameters
| Parameter | Description |
|---|---|
asset | The Asset to update (address or fetched object) |
name | New name for the Asset |
uri | New metadata URI |
newCollection | Target Collection address |
newUpdateAuthority | New authority (or None for immutable) |
Authority Types
| Type | Description |
|---|---|
Address | A specific public key |
Collection | The Collection's update authority |
None | Immutable - no updates allowed |
FAQ
Can I undo making an Asset immutable?
No. Setting the update authority to None is permanent. The Asset's name, URI, and collection membership are frozen forever. Only do this when you're certain.
How do I update only the name without changing the URI?
Pass only the fields you want to change. Omit uri to keep the current value:
await update(umi, { asset, name: 'New Name' }).sendAndConfirm(umi)
What's the difference between updating and transferring?
Update changes the Asset's metadata (name, URI). Transfer changes ownership. They're separate operations with different authority requirements.
Can a delegate update an Asset?
Yes, if they have been assigned as an Update Delegate via the Update Delegate plugin.
Does updating cost SOL?
Updates are free unless the new data is larger than the current account size (rare). The transaction fee (~0.000005 SOL) still applies.
Glossary
| Term | Definition |
|---|---|
| Update Authority | The account authorized to modify an Asset's metadata |
| Immutable | An Asset that cannot be updated (update authority is None) |
| URI | The URL pointing to off-chain metadata JSON |
| Delegate | An account granted specific permissions via a plugin |
| Collection Membership | The Collection an Asset belongs to |
