Documentation
Recipes
Real-time data fetch

Real-Time data fetch in the REST API

Use case

When building an embedded analytics application, you'd like to provide a real-time experience to the users. On some page, you'd like to display a chart that updates as soon as the data changes in the database.

Configuration

When using the REST API, you can use the WebSocket transport to receive real-time updates. Using this transport enables subscriptions to real-time updates.

Client code

JavaScript example:

import cube from "@cubejs-client/core"; import WebSocketTransport from "@cubejs-client/ws-transport";   const cubeApi = cube({  transport: new WebSocketTransport({  authorization: CUBE_TOKEN,  apiUrl: "ws://localhost:4000/",  }), });   // Create a subscription const subscription = cubeApi.subscribe(  {  measures: ["logs.count"],  timeDimensions: [  {  dimension: "logs.time",  granularity: "hour",  dateRange: "last 1440 minutes",  },  ],  },  options,  (error, resultSet) => {  if (!error) {  // handle the update  }  } );   // Later on, unsubscribe from subscription subscription.unsubscribe();

React example:

import { useCubeQuery } from "@cubejs-client/react";   const Chart = ({ query }) => {  const { resultSet, error, isLoading } = useCubeQuery(query, {  // The component will automatically unsubscribe when unmounted  subscribe: true,  });    if (isLoading) {  return <div>Loading...</div>;  }    if (error) {  return <pre>{error.toString()}</pre>;  }    if (!resultSet) {  return null;  }    return <LineChart resultSet={resultSet} />; };

Refresh rate

Real-time data fetch obeys the refresh_key. In order to provide a desired refresh rate, refresh_key should reflect the rate of change of the underlying data set; the querying time should also be much less than the desired refresh rate. Please use the every parameter to adjust the refresh interval.