Skip to main content

DeepBook Margin Flux Stream

The DeepBook Margin Flux Stream delivers real-time margin trading events directly from DeepBook Margin on Sui. Stream loan updates, manager events, deposits, withdrawals, and liquidations as they occur on-chain with sub-second latency.

Unlike the DeepBook Margin Indexing API which provides historical snapshots, Flux Streams push live events as they occur—no polling, no delays.

What You Can Build​

DeepBook Margin Flux Streams power real-time DeFi applications:

  • Risk Monitoring Dashboards — Track position health and liquidation risk in real-time
  • Liquidation Bots — Detect at-risk positions instantly for liquidation opportunities
  • Portfolio Trackers — Monitor deposits, withdrawals, and loan changes live
  • Lending Analytics — Stream borrow and repay events for real-time metrics
  • Alert Systems — Trigger notifications on position changes, liquidations, or large loans

Stream Types​

Loan Updates​

Real-time stream of loan events for a specific margin pool. Includes:

  • Loan Borrowed — New loans taken out
  • Loan Repaid — Partial or full repayments
  • Liquidations — Position liquidations

View Loan Updates Documentation →

Manager Updates​

Real-time stream of margin manager lifecycle events. Includes:

  • Manager Created — New margin managers created
  • Deposit Collateral — Collateral deposits
  • Withdraw Collateral — Collateral withdrawals
  • Liquidations — Position liquidations

View Manager Updates Documentation →

How It Works​

DeepBook Margin Flux Streams use Server-Sent Events (SSE), a standard HTTP-based protocol for real-time push notifications.

Connection Flow​

  1. Connect — Open SSE connection to the stream endpoint with your API key
  2. Stream — Receive events as margin activities occur on-chain
  3. Process — Handle events in your application to update UI or trigger logic

Event Resumption​

Both streams support resumption from a specific point using the last-id parameter:

  • last-id — Resume from events after this ID (client persists the event ID)
  • last-id=0 — Consume from the beginning (limited by server retention)
  • last-id=$ — Consume only real-time events (skip historical)

Quick Start​

Connect to Loan Updates​

const marginPoolId = '0x4405b50d791fd3346754e8171aaab6bc2ed26c2c46efdd033c14b30ae507ac33';
const apiKey = 'YOUR_API_KEY';

const eventSource = new EventSource(
`https://flux.surflux.dev/deepbook-margin/${marginPoolId}/loan-updates?api-key=${apiKey}`
);

eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);

switch (data.type) {
case 'deepbook_margin_loan_updates_loan_borrowed':
console.log('New loan:', data.data.loan_amount);
break;
case 'deepbook_margin_loan_updates_loan_repaid':
console.log('Loan repaid:', data.data.repay_amount);
break;
case 'deepbook_margin_loan_updates_liquidation':
console.log('Liquidation!', data.data.liquidation_amount);
break;
}
};

eventSource.onerror = (error) => {
console.error('Connection error:', error);
// Implement reconnection logic
};

Connect to Manager Updates​

const apiKey = 'YOUR_API_KEY';

const eventSource = new EventSource(
`https://flux.surflux.dev/deepbook-margin/manager-updates?api-key=${apiKey}`
);

eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);

switch (data.type) {
case 'deepbook_margin_manager_updates_manager_created':
console.log('New manager:', data.data.margin_manager_id);
break;
case 'deepbook_margin_manager_updates_deposit':
console.log('Deposit:', data.data);
break;
case 'deepbook_margin_manager_updates_withdraw':
console.log('Withdrawal:', data.data);
break;
case 'deepbook_margin_manager_updates_liquidation':
console.log('Liquidation:', data.data);
break;
}
};

Authentication​

All DeepBook Margin Flux Streams require authentication via API key. Include your key as a query parameter:

?api-key=YOUR_API_KEY

Don't have an API key yet? Create your Surflux account to get started.

Base URL​

https://flux.surflux.dev/

Event ID Persistence​

Each SSE event includes an id field. To resume streaming from where you left off:

  1. Store the event ID after processing each event
  2. Reconnect with last-id=<stored-id> to resume
let lastEventId = localStorage.getItem('lastMarginEventId') || '0';

const eventSource = new EventSource(
`https://flux.surflux.dev/deepbook-margin/${poolId}/loan-updates?api-key=${apiKey}&last-id=${lastEventId}`
);

eventSource.onmessage = (event) => {
// Store the event ID for resumption
localStorage.setItem('lastMarginEventId', event.lastEventId);

// Process the event
const data = JSON.parse(event.data);
handleEvent(data);
};

Best Practices​

  • Persist Event IDs — Store the last processed event ID to resume after disconnections
  • Implement Reconnection — SSE connections can drop; use exponential backoff to reconnect
  • Filter by Type — Each stream includes multiple event types; route by the type field
  • Combine with Indexing API — Use DeepBook Margin Indexing API for historical data, streams for live updates
  • Monitor Multiple Pools — Open separate connections for each margin pool you want to monitor

Next Steps​

Choose the event stream you need:


Additional Resources​