WebSocket Roadmap
Upcoming subscription and filtering features for WebSocket streaming
WebSocket Roadmap
Current Status - Beta
WebSocket is currently in beta and broadcasts all network transactions to connected clients. The subscription and filtering features described on this page are coming soon and not yet available.
Current Implementation
What Works Today
- ✅ Connect and receive - Open a WebSocket connection and immediately receive all network transactions
- ✅ Real-time streaming - Sub-100ms latency for transaction events
- ✅ Automatic broadcast - No subscription messages required
- ✅ Full transaction data - Complete transaction details including signature, slot, accounts, logs
What to Use Instead
For features not yet available via WebSocket, use the Geyser REST API:
- Filter by specific accounts
- Filter by programs/smart contracts
- Query historical data
- Choose commitment levels
Learn more about Geyser REST API →
Planned Features
The following subscription and filtering capabilities are in development:
1. Transaction Filtering (Coming Q1 2026)
Filter transactions by account, program, or status before they're sent to you.
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'transactions',
filters: {
accounts: ['YourWalletAddress'],
commitment: 'confirmed'
}
}));Use cases when available:
- Monitor specific wallet transactions only
- Track smart contract interactions
- Filter successful vs failed transactions
- Reduce bandwidth by receiving only relevant data
2. Commitment Level Selection (Coming Q1 2026)
Choose between processed, confirmed, or finalized commitment levels.
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'transactions',
filters: {
commitment: 'finalized' // or 'confirmed', 'processed'
}
}));| Commitment | Speed | Reliability |
|---|---|---|
processed | Fastest | May be rolled back |
confirmed | Balanced | Cluster confirmed |
finalized | Slowest | Irreversible |
3. Block Updates (Coming Q2 2026)
Subscribe to new blocks as they're produced.
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'blocks',
filters: {
commitment: 'confirmed'
}
}));Expected message format:
{
"type": "block",
"timestamp": "2026-01-15T12:34:56.789Z",
"data": {
"slot": 245678900,
"blockhash": "8sWHr7A9SyBWjP...",
"parentSlot": 245678899,
"blockTime": 1700000000,
"blockHeight": 205678900,
"transactionCount": 2847
}
}4. Account State Changes (Coming Q2 2026)
Monitor specific accounts for state changes (Business+ tier).
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'accounts',
filters: {
accounts: ['AccountPubkey1', 'AccountPubkey2'],
commitment: 'confirmed'
}
}));Use cases when available:
- Track wallet balance changes
- Monitor smart contract state
- Watch for program account updates
- Real-time portfolio tracking
5. Slot Progression (Coming Q2 2026)
Track consensus and slot progression in real-time.
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'slots'
}));Expected message format:
{
"type": "slot",
"timestamp": "2026-02-15T12:34:56.789Z",
"data": {
"slot": 245678900,
"parent": 245678899,
"root": 245678850
}
}6. Program-Specific Subscriptions (Coming Q2 2026)
Subscribe to specific program interactions.
Planned API:
// This does NOT work yet - coming soon!
ws.send(JSON.stringify({
action: 'subscribe',
channel: 'transactions',
filters: {
programs: ['DEXProgramAddress', 'TokenProgramAddress'],
commitment: 'confirmed'
}
}));Use cases when available:
- Monitor DEX activity
- Track NFT marketplace sales
- Watch lending protocol interactions
- Build program-specific analytics
Current Workaround: Client-Side Filtering
Until server-side filtering is available, filter transactions client-side:
const WebSocket = require('ws');
const ws = new WebSocket('wss://nexus.fortiblox.com/geyser/ws', {
headers: { 'X-API-Key': 'fbx_YOUR_KEY_HERE' }
});
const WATCHED_ACCOUNTS = new Set([
'YourWalletAddress1',
'YourWalletAddress2'
]);
ws.on('message', (data) => {
const message = JSON.parse(data);
if (message.type === 'transaction') {
// Client-side filtering
const hasWatchedAccount = message.data.accounts?.some(
account => WATCHED_ACCOUNTS.has(account)
);
if (hasWatchedAccount) {
console.log('Relevant transaction:', message.data.signature);
}
}
});Performance Note
Client-side filtering means you receive all transactions and filter them in your code. This uses more bandwidth than server-side filtering. For low-volume monitoring, consider using the REST API instead.
When Will These Features Be Available?
| Feature | Target Timeline | Status |
|---|---|---|
| Transaction filtering | Q1 2026 | In development |
| Commitment levels | Q1 2026 | In development |
| Block updates | Q2 2026 | Planned |
| Account subscriptions | Q2 2026 | Planned |
| Slot progression | Q2 2026 | Planned |
| Program filtering | Q2 2026 | Planned |
Timelines are estimates and subject to change. Follow our Discord for updates.
Vote on Features
Want to influence the roadmap? Let us know which features are most important to you:
- Discord: discord.gg/fortiblox - Share feedback in #feature-requests
- Email: [email protected] - Request specific features
- GitHub: github.com/fortiblox - Submit feature requests
Current Alternatives
While waiting for these features, here's what you can use today:
For Account/Program Queries
Use the Geyser REST API for filtered historical data:
# Get transactions for a specific account
curl "https://nexus.fortiblox.com/api/geyser/v1/transactions?account=YourWallet" \
-H "X-API-Key: fbx_YOUR_KEY"
# Get transactions for a specific program
curl "https://nexus.fortiblox.com/api/geyser/v1/transactions?program=ProgramAddress" \
-H "X-API-Key: fbx_YOUR_KEY"For Real-Time Full Stream
Use WebSocket for complete network monitoring:
const ws = new WebSocket(
'wss://nexus.fortiblox.com/geyser/ws?api-key=fbx_YOUR_KEY'
);
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'transaction') {
// Process all transactions
processTransaction(data.data);
}
};