FortiBlox LogoFortiBlox Docs
NexusWebSocket Streaming

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'
  }
}));
CommitmentSpeedReliability
processedFastestMay be rolled back
confirmedBalancedCluster confirmed
finalizedSlowestIrreversible

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?

FeatureTarget TimelineStatus
Transaction filteringQ1 2026In development
Commitment levelsQ1 2026In development
Block updatesQ2 2026Planned
Account subscriptionsQ2 2026Planned
Slot progressionQ2 2026Planned
Program filteringQ2 2026Planned

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:

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"

Geyser API Documentation →

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);
  }
};

WebSocket Getting Started →

Next Steps