Developer Hub
🔮 For applications
API
WebSocket API
How to use

How to use

Connecting to WebSocket

To connect to the WebSocket API, you can use the WebSocket API available in modern browsers or a WebSocket client library:

// For development
const socketUrl = "wss://dev-streams.onchainfeed.org/v1/streams/feed";
// For production
// const socketUrl = "wss://streams.onchainfeed.org/v1/streams/feed";
 
const socket = new WebSocket(socketUrl);
 
socket.onopen = () => {
  console.log("WebSocket connection established");
};
 
socket.onerror = (error) => {
  console.error("WebSocket error:", error);
};
 
socket.onclose = () => {
  console.log("WebSocket connection closed");
};

Subscribing to Updates

Subscribing to Condition Updates

To receive real-time updates for specific conditions:

// Subscribe to condition updates
socket.send(JSON.stringify({
  event: "SubscribeConditions",
  data: {
    conditionIds: ["300610060000000000643869810000000000000075712122"],
    environment: "PolygonAmoyUSDT"
  }
}));
 
// Handle condition updates
socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
 
  if (data.event === "ConditionUpdated") {
    const conditionData = data.data;
    console.log("Condition updated:", conditionData);
 
    // Update UI with new condition data
    updateConditionInUI(conditionData);
  }
};

Subscribing to Game Updates

To receive real-time updates for specific games:

// Subscribe to game updates
socket.send(JSON.stringify({
  event: "SubscribeGames",
  data: {
    gameIds: ["789", "101112"],
    environment: "PolygonAmoyUSDT"
  }
}));
 
// Handle game updates
socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
 
  if (data.event === "GameUpdated") {
    const gameData = data.data;
    console.log("Game updated:", gameData);
 
    // Update UI with new game data
    updateGameInUI(gameData);
  }
};

Handling Multiple Subscriptions

You can subscribe to multiple types of updates and handle them in a single message handler:

// Subscribe to both condition and game updates
socket.send(JSON.stringify({
  event: "SubscribeConditions",
  data: {
    conditionIds: ["300610060000000000643869810000000000000075712122"],
    environment: "PolygonAmoyUSDT"
  }
}));
 
socket.send(JSON.stringify({
  event: "SubscribeGames",
  data: {
    gameIds: ["789", "101112"],
    environment: "PolygonAmoyUSDT"
  }
}));
 
// Handle all updates
socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
 
  switch (data.event) {
    case "ConditionUpdated":
      const conditionData = data.data;
      console.log("Condition updated:", conditionData);
      updateConditionInUI(conditionData);
      break;
    case "GameUpdated":
      const gameData = data.data;
      console.log("Game updated:", gameData);
      updateGameInUI(gameData);
      break;
    default:
      console.log("Unknown event:", data.event);
  }
};

Unsubscribing from Updates

To stop receiving updates for specific conditions or games:

// Unsubscribe from condition updates
socket.send(JSON.stringify({
  event: "UnsubscribeConditions",
  data: {
    conditionIds: ["300610060000000000643869810000000000000075712122"],
    environment: "PolygonAmoyUSDT"
  }
}));
 
// Unsubscribe from game updates
socket.send(JSON.stringify({
  event: "UnsubscribeGames",
  data: {
    gameIds: ["789", "101112"],
    environment: "PolygonAmoyUSDT"
  }
}));

Reconnection Strategy

WebSocket connections can be interrupted for various reasons. It's important to implement a reconnection strategy to ensure your application maintains a connection to the WebSocket API:

function connectWebSocket() {
  const socket = new WebSocket(socketUrl);
 
  socket.onopen = () => {
    console.log("WebSocket connection established");
    // Resubscribe to updates if needed
    subscribeToUpdates(socket);
  };
 
  socket.onerror = (error) => {
    console.error("WebSocket error:", error);
  };
 
  socket.onclose = () => {
    console.log("WebSocket connection closed");
    // Reconnect after a delay
    setTimeout(() => {
      console.log("Attempting to reconnect...");
      connectWebSocket();
    }, 5000); // 5 seconds delay
  };
 
  socket.onmessage = handleMessage;
 
  return socket;
}
 
function subscribeToUpdates(socket) {
  // Subscribe to condition updates
  socket.send(JSON.stringify({
    event: "SubscribeConditions",
    data: {
      conditionIds: ["300610060000000000643869810000000000000075712122"],
      environment: "PolygonAmoyUSDT"
    }
  }));
 
  // Subscribe to game updates
  socket.send(JSON.stringify({
    event: "SubscribeGames",
    data: {
      gameIds: ["789", "101112"],
      environment: "PolygonAmoyUSDT"
    }
  }));
}
 
function handleMessage(event) {
  const data = JSON.parse(event.data);
 
  switch (data.event) {
    case "ConditionUpdated":
      const conditionData = data.data;
      console.log("Condition updated:", conditionData);
      updateConditionInUI(conditionData);
      break;
    case "GameUpdated":
      const gameData = data.data;
      console.log("Game updated:", gameData);
      updateGameInUI(gameData);
      break;
    default:
      console.log("Unknown event:", data.event);
  }
}
 
// Initial connection
const socket = connectWebSocket();

Update Data Structure

Condition Update Data

When a condition is updated, the WebSocket API sends a message with the following structure:

{
  "event": "ConditionUpdated",
  "data": {
    "id": "300610060000000000643869810000000000000075712122",
    "conditionId": "300610060000000000643869810000000000000075712122",
    "title": "Match Winner",
    "state": "Active",
    "isPrematchEnabled": true,
    "isLiveEnabled": false,
    "isExpressForbidden": false,
    "outcomes": [
      {
        "id": "300610060000000000643869810000000000000075712122-1",
        "outcomeId": 1,
        "title": "Team A",
        "currentOdds": "2.5"
      },
      {
        "id": "300610060000000000643869810000000000000075712122-2",
        "outcomeId": 2,
        "title": "Team B",
        "currentOdds": "1.8"
      }
    ]
  }
}

Game Update Data

When a game is updated, the WebSocket API sends a message with the following structure:

{
  "event": "GameUpdated",
  "data": {
    "id": "789",
    "gameId": "789",
    "title": "Team A vs Team B",
    "startsAt": "1630000000",
    "state": "Live",
    "sport": {
      "name": "Football",
      "slug": "football"
    },
    "league": {
      "name": "Premier League",
      "country": {
        "name": "England"
      }
    },
    "participants": [
      {
        "name": "Team A",
        "image": "https://example.com/team-a.png",
        "sortOrder": 1
      },
      {
        "name": "Team B",
        "image": "https://example.com/team-b.png",
        "sortOrder": 2
      }
    ],
    "score": {
      "home": 1,
      "away": 0
    }
  }
}
ℹ️

The WebSocket API is designed to work in conjunction with The Graph API. While The Graph API provides historical data and bet information, the WebSocket API provides real-time updates for games and conditions.