NFT Events
XRNotify tracks the full lifecycle of Non-Fungible Tokens on the XRPL. Five event types cover every stage — from minting to burning, and the entire offer marketplace. Use nft.* to subscribe to all of them with a single wildcard.
nft.minted
NFTokenMintFires when an NFTokenMint transaction is validated. This includes mints by the token owner as well as authorized mints where an issuer delegates minting to another account.
Payload schema
| Field | Type | Description |
|---|---|---|
| nft_id | string | Unique 64-character hex identifier for this NFT on the ledger |
| issuer | string | Account address of the NFT issuer |
| owner | string | Current owner of the NFT (may differ from issuer on authorized mints) |
| uri | string | null | Hex-encoded metadata URI as stored on-chain |
| uri_decoded | string | null | Human-readable decoded URI (e.g. ipfs://...), null if not set |
| flags | number | Bitmask of NFToken flags (transferable, burnable, etc.) |
| taxon | number | Collection identifier chosen by the issuer |
| transfer_fee | number | Royalty fee in basis points (0–50000, i.e. 0%–50%) |
| sequence | number | Sequence number embedded in the NFT ID |
| ledger_index | number | Ledger in which the mint was validated |
| tx_hash | string | Transaction hash of the mint transaction |
Example payload
{
"event_id": "xrpl:89550100:D1E2F3A4B5C6:nft.minted",
"event_type": "nft.minted",
"ledger_index": 89550100,
"timestamp": "2024-01-15T11:00:00Z",
"network": "mainnet",
"payload": {
"nft_id": "000813882AF7E9CF50D5B231EF2C804F1EB3E26EA2D18AB4000000000000001E",
"issuer": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe",
"owner": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe",
"uri": "697066733A2F2F516D61626364656667",
"uri_decoded": "ipfs://Qmabcdefghijklmnopqrstuvwxyz1234",
"flags": 8,
"taxon": 1000,
"transfer_fee": 500,
"sequence": 30,
"ledger_index": 89550100,
"tx_hash": "D1E2F3A4B5C6D1E2F3A4B5C6D1E2F3A4B5C6D1E2F3A4B5C6D1E2F3A4B5C6D1E2"
}
}nft.burned
NFTokenBurnFires when an NFTokenBurn transaction permanently destroys an NFT. After burning, the NFT ID is invalid and cannot be reused.
Payload schema
| Field | Type | Description |
|---|---|---|
| nft_id | string | NFT identifier that was burned |
| owner | string | Account address that held and burned the NFT |
| ledger_index | number | Ledger in which the burn was validated |
| tx_hash | string | Transaction hash of the burn transaction |
nft.offer_created
NFTokenCreateOfferFires when an NFTokenCreateOffer transaction creates either a sell offer (owner offering to sell) or a buy offer (buyer offering to purchase). Both types generate the same event.
Payload schema
| Field | Type | Description |
|---|---|---|
| offer_id | string | Unique ledger object ID for this offer |
| nft_id | string | NFT this offer is for |
| owner | string | Account address that created the offer |
| destination | string | null | If set, only this account can accept the offer (private offer) |
| amount | string | object | Price — a drops string for XRP, or {currency, value, issuer} for issued tokens |
| is_sell_offer | boolean | True if the offer owner is selling; false if they are buying |
| expiration | string | null | ISO 8601 timestamp after which the offer expires, or null for no expiry |
| ledger_index | number | Ledger in which the offer was created |
| tx_hash | string | Transaction hash |
nft.offer_accepted
NFTokenAcceptOfferFires when an NFTokenAcceptOffer transaction completes a sale. This is the definitive "NFT sold" event — ownership has transferred and payment has settled.
Payload schema
| Field | Type | Description |
|---|---|---|
| offer_id | string | ID of the offer that was accepted |
| nft_id | string | NFT that changed hands |
| buyer | string | Account address of the new NFT owner |
| seller | string | Account address of the previous NFT owner |
| price | string | object | Sale price — drops string for XRP or {currency, value, issuer} for tokens |
| broker | string | null | Broker account address if a third-party facilitated the sale, otherwise null |
| ledger_index | number | Ledger in which the acceptance was validated |
| tx_hash | string | Transaction hash |
Example payload
{
"event_id": "xrpl:89552000:F4A3B2C1D0E9:nft.offer_accepted",
"event_type": "nft.offer_accepted",
"ledger_index": 89552000,
"timestamp": "2024-01-15T12:15:30Z",
"network": "mainnet",
"payload": {
"offer_id": "B2C3D4E5F6A7B2C3D4E5F6A7B2C3D4E5F6A7B2C3D4E5F6A7B2C3D4E5F6A7B2C3",
"nft_id": "000813882AF7E9CF50D5B231EF2C804F1EB3E26EA2D18AB4000000000000001E",
"buyer": "rN7n3473SaZBCG4dFL83w7PB2bBdDiAkzN",
"seller": "rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe",
"price": "50000000",
"broker": null,
"ledger_index": 89552000,
"tx_hash": "F4A3B2C1D0E9F4A3B2C1D0E9F4A3B2C1D0E9F4A3B2C1D0E9F4A3B2C1D0E9F4A3"
}
}nft.offer_cancelled
NFTokenCancelOfferFires when one or more NFT offers are cancelled via NFTokenCancelOffer. A single transaction can cancel multiple offers at once — the offer_id field is an array to accommodate this.
Payload schema
| Field | Type | Description |
|---|---|---|
| offer_id | string[] | Array of cancelled offer IDs — may contain one or more entries |
| nft_id | string | NFT the cancelled offer(s) were for |
| account | string | Account that submitted the cancellation |
| ledger_index | number | Ledger in which the cancellation was validated |
| tx_hash | string | Transaction hash |