Implementing NFT Trade Notifications in Mobile App
NFT sold on OpenSea for 2 ETH — owner didn't see notification because push permissions not requested during onboarding, and wallet polling worked with 5-minute delay. For NFT marketplace direct user loss.
Event Sources for NFT Notifications
Several scenarios: NFT from watchlist collection sold, new NFT listed below floor, offer accepted, new collection mint. Each requires separate data source.
OpenSea provides Stream API (wss://stream.openseabeta.com/socket) with events item_listed, item_sold, offer_entered. Subscribe by collection or wallet address. Cleanest option for Ethereum and Polygon.
Blur and Magic Eden have own APIs, but less stable WebSocket streams — prefer polling via REST every 15–30 seconds.
For multi-chain tracking (Solana + ETH) use aggregators: Reservoir API (api.reservoir.tools) covers most marketplaces with unified event format.
Delivery Architecture
Server subscriber listens to WebSocket stream → on event checks for users with address/collection in watchlist → creates personal payload → sends via Firebase Admin SDK.
Gotcha — duplicates. OpenSea Stream may send same event multiple times on reconnect. Dedup via Redis: SET event:{event_id} 1 EX 300 NX — if key exists, skip event.
Notification payload:
{
"title": "Sold: Azuki #4821",
"body": "2.4 ETH · OpenSea · just now",
"image": "https://cdn.azuki.com/4821.png",
"data": {
"nft_contract": "0xed5af...",
"token_id": "4821",
"marketplace": "opensea",
"price_eth": "2.4"
}
}
NFT image in notification — important detail. On iOS mutable-content: 1 + UNNotificationServiceExtension to load image and attach as UNNotificationAttachment. On Android — BigPictureStyle via NotificationCompat.
Notification Channels Setup
On Android create separate notification channels:
-
nft_sales— sales from watchlist -
nft_listings— new listings below floor -
nft_offers— offers on your NFTs
User can disable each channel independently in system settings. Standard for financial apps.
On iOS use UNNotificationCategory with action buttons: "View" (opens marketplace) and "Remove from watchlist".
Integration into existing app with ready backend — 1–2 weeks. If need to develop server subscriber from scratch — 3–4 weeks.







