
NFTs that can change
3 minDifficulty Checked 2026-11-10- A dynamic NFT is minted with tfMutable. The choice is made once, at mint.
- NFTokenModify changes the URI. Only the issuer or its authorized minter can send it.
- DynamicNFT has been live on Mainnet since 2025-06-11.
A standard NFT is like a printed trading card. Once it is printed, the card never changes.
Some things need to change. xrpl.org gives two examples:
- A concert is postponed. The ticket NFT should show the new date.
- A sports card should show the player's latest statistics.
Before dynamic NFTs, an issuer had two poor choices. It could mint a new NFT to replace the old one. Or it could point the NFT at a website and quietly change the website.
A dynamic NFT solves this in the open. Think of a card with a small window in it. The issuer can swap what shows in the window. Everyone can see that the card has a window, and everyone can see each swap.
The window is the NFT's URI, the pointer to its artwork or data. The issuer sends a transaction that replaces the pointer.
Two rules keep this honest:
- The NFT must be minted as mutable. A standard NFT can never be turned into a dynamic one later.
- Only the issuer, or the issuer's authorized minter, can make the change. The holder cannot.
Dynamic NFTs have been live on the XRP Ledger since 2025-06-11.
The DynamicNFT amendment implements XLS-46. It became enabled on Mainnet on 2025-06-11. It adds one mint flag and one transaction type.
tfMutable. A flag on NFTokenMint, value 0x00000010 (16). It is stored on the NFT as flagMutable. Flags are part of the NFTokenID, so the setting is permanent.
NFTokenModify. Updates the URI of a mutable NFT.
| Field | Required | Meaning |
|---|---|---|
NFTokenID | Yes | The NFT to modify |
Owner | No | The current holder. Omit when the sender holds the NFT |
URI | No | New value, up to 256 bytes, hex encoded. If omitted, the existing URI is deleted |
Example:
{
"TransactionType": "NFTokenModify",
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"Owner": "rogue5HnPRSszD9CWGSUz8UGHMVwSSKF6",
"NFTokenID": "0008C350C182B4F213B82CCFA4C6F59AD76F0AFCFBDF04D5A048C0A300000007",
"URI": "697066733A2F2F..."
}Who can send it. The issuer, or the account named in the issuer's NFTokenMinter field. The transaction fails with tecNO_PERMISSION if the NFT was not minted with tfMutable, or if the sender is neither of those accounts.
Why only the URI. The XLS-46 authors chose the least invasive design. Flags, transfer fee, issuer, taxon and sequence are all inside the NFTokenID. Changing any of them would change the ID, so the specification leaves them alone.
The ledger does not check the new URI. As with a mint, it can be an HTTPS URL, an IPFS URI, a data: URL or an issuer's own encoding.
Related: What changes and what cannot, Transfer fees and flags.
- Dynamic NFTsRead 2026-11-10
- NFTokenModifyRead 2026-11-10
- XLS-46 Dynamic Non Fungible TokensRead 2026-11-10
- DynamicNFT is Now AvailableRead 2026-11-10
- Known AmendmentsRead 2026-11-10
