OpenSea Stream API - JavaScript SDK
A Javascript SDK for receiving updates from the OpenSea Stream API - pushed over websockets. We currently support the following event types on a per-collection basis:
- item listed
- item sold
- item transferred
- item metadata updates
- item cancelled
- item received offer
- item received bid
This is a best effort delivery messaging system. Messages that are not received due to connection errors will not be re-sent. Messages may be delivered out of order. This SDK is offered as a beta experience as we work with developers in the ecosystem to make this a more robust and reliable system.
Documentation: https://docs.opensea.io/reference/stream-api-overview
Installation
We recommend switching to Node.js version 16 to make sure common crypto dependencies work. Our minimum supported version is 16.11.0.
- Install this package with
npm install @opensea/stream-js
- NodeJS only: Install the WebSocket library with
npm install ws
- Install the required dev-dependency to use the Phoenix client for web socket connections
npm install --save-dev @types/phoenix
Getting Started
Authentication
In order to make onboarding easy, we've integrated the OpenSea Stream API with our existing API key system. The API keys you have been using for the REST API should work here as well. If you don't already have one, request an API key from us here.
Create a client
Browser
import { OpenSeaStreamClient } from '@opensea/stream-js';
const client = new OpenSeaStreamClient({
token: 'openseaApiKey'
});
Node.JS
import { OpenSeaStreamClient } from '@opensea/stream-js';
import { WebSocket } from 'ws';
const client = new OpenSeaStreamClient({
token: 'openseaApiKey',
connectOptions: {
transport: WebSocket
}
});
You can also optionally pass in:
- a
network
if you would like to access testnet networks.- The default value is
Network.MAINNET
, which represents the following blockchains: Ethereum, Polygon mainnet, Klaytn mainnet, and Solana mainnet - Can also select
Network.TESTNET
, which represents the following blockchains: Rinkeby, Polygon testnet (Mumbai), and Klaytn testnet (Baobab).
- The default value is
apiUrl
if you would like to access another OpenSea Stream API endpoint. Not needed if you provide a network or use the default values.- an
onError
callback to handle errors. The default behavior is toconsole.error
the error. - a
logLevel
to set the log level. The default isLogLevel.INFO
.
Available Networks
The OpenSea Stream API is available on the following networks:
Mainnet
wss://stream.openseabeta.com/socket
Mainnet supports events from the following blockchains: Ethereum, Polygon mainnet, Klaytn mainnet, and Solana mainnet.
Testnet
wss://testnets-stream.openseabeta.com/socket
Testnet supports events from the following blockchains: Rinkeby, Polygon testnet (Mumbai), and Klaytn testnet (Baobab).
To create testnet instance of the client, you can create it with the following arguments:
import { OpenSeaStreamClient, Network } from '@opensea/stream-js';
const client = new OpenSeaStreamClient({
network: Network.TESTNET,
token: 'openseaApiKey'
});
Manually connecting to the socket (optional)
The client will automatically connect to the socket as soon as you subscribe to the first channel. If you would like to connect to the socket manually (before that), you can do so:
client.connect();
After successfully connecting to our websocket it is time to listen to specific events you're interested in!
Streaming metadata updates
We will only send out metadata updates when we detect that the metadata provided in tokenURI
has changed from what OpenSea has previously cached.
client.onItemMetadataUpdated('collection-slug', (event) => {
// handle event
});
Streaming item listed events
client.onItemListed('collection-slug', (event) => {
// handle event
});
Streaming item sold events
client.onItemSold('collection-slug', (event) => {
// handle event
});
Streaming item transferred events
client.onItemTransferred('collection-slug', (event) => {
// handle event
});
Streaming bids and offers
client.onItemReceivedBid('collection-slug', (event) => {
// handle event
});
client.onItemReceivedOffer('collection-slug', (event) => {
// handle event
});
Streaming multiple event types
client.onEvents(
'collection-slug',
[EventType.ITEM_RECEIVED_OFFER, EventType.ITEM_TRANSFERRED],
(event) => {
// handle event
}
);
Streaming order cancellations events
client.onItemCancelled('collection-slug', (event) => {
// handle event
});
Subscribing to events from all collections
If you'd like to listen to an event from all collections use wildcard *
for the collectionSlug
parameter.
Types
Types are included to make working with our event payload objects easier.
Disconnecting
From a specific stream
All subscription methods return a callback function that will unsubscribe from a stream when invoked.
const unsubscribe = client.onItemMetadataUpdated('collection-slug', noop);
unsubscribe();
From the socket
client.disconnect();
Contributing
See the contributing guide for detailed instructions on how to get started with this project.
License
MIT Copyright 2022 Ozone Networks, Inc.