A Step-By-Step Guide to Creating a Luzmo API Plugin with Air Quality Data

September 8, 2022

Tuana Çelik

Learn how to create a dashboard monitoring air quality data with Luzmo.

🚨 Our embedded analytics platform, formerly called, is now Luzmo! You can read all about our rebranding here. To avoid confusion: the GitHub repos and code snippets used in this tutorial will reference But fear not! Any code that you'll leverage in this tutorial is still fully functional. So simply follow along, and if you'd happen to run into any issues, you can reach us at

Alright, so as I am in the process of learning about Luzmo (formerly myself, what better way to learn about plugins than building one. So, in this post I’ll walk through how I built a plugin with an open API. I’ll go up to how I integrated it in a simple web page. I wanted to build something that I’d actually care about and be interested in looking at so I spent quite some time looking through open APIs. I wanted one that would provide some pollution or climate change data. I’ve ended up using the AirVisual API (if you have any other suggestions for future projects please tell me in the comments!). As I’m using the community version I limited myself to a few major cities around the world and am displaying daily air quality data for them. This is what I ended up with:

Air quality dashboard by Luzmo (formerly

Like my previous post on multi-tenancy, I am accompanying this one with open repositories so you can follow the steps exactly if you so wish. First, cumulio-pollution for the plugin itself. Second, cumulio-pollution-landingpage, a simple webpage to integrate the dashboard into. If you don’t use these repos, each of the steps should still be relevant to anyone trying to build a basic plugin from an API for their Luzmo dashboard.

Why would you build a plugin?

Luzmo provides great visualizations for your data, but there’s the question of connecting such data to it. One way to accomplish this is by writing your own plugin, for example for an existing API. Plugins work as a bridge, or a connector from an external source of data to Luzmo.

Without further ado, let me jump into how I got this thing working:

  1. Building the Plugin
  2. Building the Dashboard
  3. Integrating the Dashboard
  4. Filtering the Dashboard (Extra)
  5. Useful Resources

Building the Plugin

First step is to build the plugin itself. I’ve built mine on cumulio-pollution which you can clone if you’d like to follow the next steps exactly. To begin, I followed the steps in a previous tutorial on how to build plugins for Luzmo dashboards which I found very useful, would recommend.

Here I will be building a basic plugin with no added authorization, since I’m using an open data source. I will connect to the open API from AirVisual as an example. This contains real time and historical weather and air quality data for requested cities, as well as forecast.

Once the plugin is written and added to Luzmo, it will appear as a new data source when you want to add data to your dashboard in your account.

To start with, you will need the following:

  1. A Luzmo account (there are free trials available)
  2. An API Key from AirVisual (I used the community edition)
  3. An App Secret from Luzmo which you get when you create the plugin on your profile (which will follow later in this article)

This plugin only needs two endpoints. The /datasets endpoint and the /query endpoint:

The /datasets Endpoint

This endpoint gives information about the structure of the data to Luzmo. In my example, I’m only going to be providing one dataset:

The code defines 5 columns which the AirVisual API will fill with city names, update time, latitude, longitude and the two air quality indexes (US and China have different measures for air quality).

Note: If you run your code at this point you can have a look on postman to test GET localhost:3030/datasets

The /query Endpoint

At this point, we’ve defined what the dataset will be but there’s no actual data coming in. This is where we use the /query endpoint. In a regular plugin the result of the /query call returns an array of arrays with values that follow the exact same structure as defined in the /datasets endpoint. For example, we could return something like this:

Now, what the following code does is create this array of arrays returned by the /query endpoint with responses it gets from the AirVisual API. I have picked a few major cities so as to limit the number of requests I make to the API. Feel free to change them as you like. To receive air quality and weather data, the API expects the name of the city, its state and country in the request:

Since there are limits to the number of requests I can make to the API within a given time period, I’ve implemented a cache and am checking whether the fields are over 24 hours old. If they are, I am adding to my cache:

If you’ve cloned and are using the cumulio-pollution repository, you can do the following to run the plugin:

  1. npm install
  2. Create a file called ‘.env’ in the root directory. Here, fill the API_KEY with the key you create with AirVisual API, and CUMULIO_SECRET with the App Secret that is created when you create the plugin on Luzmo:
  3. npm run start or node index.js

To test that the /query endpoint works correctly I used postman (If you do, don’t forget to add the app secret to the header):

Now your plugin is running on localhost:3030, but we have to add it to your Luzmo account and make it accessible to it. For this step, I used ngrok. Running this will give you a https URL that you can use to make your plugin accessible from outside your PC. If you’re using Visual Studio Code you can install the ngrok extension, run it with port number 3030 and copy link (you can also run ngrok on a separate terminal). Once you’ve done that you can now;

Create the plugin on Luzmo

Now let’s add your plugin to Luzmo. Go to your profile and Create Plugin on the Plugins tab. Add the URL created in the previous step to Base URL & authentication:

Once it’s been created you will see the plugin on your profile and you can copy the App Secret to the CUMULIO_SECRET field in your .env file:

Building the Dashboard

Now that you have a plugin, when it’s running, you can create a dashboard on Luzmo and add your plugin as a data source to it. Create a new dashboard and go to add data. You should now see a new plugin in the ‘Your plugins’ tab:

Add the plugin as a data source

Since we told the plugin to return only one dataset in the /datasets endpoint, you will see the following which you can import:

Import the dataset

Now you will see the Air Quality for Select Cities dataset listed on the right as one of your datasets. If you ‘Open in Editor’, you should see the following:

The dataset with data received from the AirVisual API

You can now use this dataset to build pretty dashboards to your heart’s content 🙂 I, for example, decided that I would like to display a map, and that I would like the symbol colours to represent the official air quality colouring system. In the rest of this section, I’ll walk through what I did and how I achieved it;

Adding Coordinates and Custom Colors

For those of you who are interested, here is the color scheme for the US air quality index (which is the one I used):

  • 0 – 50 Healthy (green)
  • 51 – 100 Moderate (yellow)
  • 101-150 Unhealthy for Sensitive Groups (orange)
  • 151 – 200 Unhealthy (red)
  • 201 – 300 Very Unhealthy (purple)
  • 301 =< Hazardous (maroon)

So I added two new fields to the dataset: Health Status and Coordinates.

Let's start with Health Status.

On the Dataset Editor, select Add Formula and you can now define a chain of if statements that checks the Air Quality Index (US) column and classifies the health status:

To add colors, in the settings for the Health Status column you’ve just created, you can Edit Hierarchy and define custom colors:

Now let's look at Coordinates.

For this one, I already had latitude and longitude columns in the dataset so I simply had to select one of the two and add coordinates:

Once I had these two columns ready, I added a few charts to my dashboard:

Adding a map

For this, I’ve used a symbol map and have added the Coordinates column to Geography, the Health Status column to Color and the Air Quality Index (US) column to Measure. For more info on how to add data to your dashboard charts you can visit this webinar on adding charts.

I also want this map and the following bar chart to display today’s figures. So I’ve added a filter that checks the Update time is within the last 1 day:

Adding a bar chart

The bar chart is much the same as the map, it displays the days air quality data. So again, I’ve added Air Quality Index (US) as Measure, but this time I’ve added the City to Category and Health Status to Group By. The same filter is also used here to display only the last 1 day. In the Item Settings, you can select Stacked Mode to achieve the same visuals.

Adding a grouped line chart

The line chart aims to provide a timeline for air quality data, so it will build up as you keep your plugin running. In the image above you see mine with 2 days of data. The X-axis is Update time, the Measure again is Air Quality Index (US) and the Group By is City.

Adding speedometers

This last one I couldn’t resist. The speedometer was recently introduced to the dashboard editor. So, I selected two cities, Delhi and New York, and am displaying their air quality indexes here as well. In addition to the filter selecting the last 1 day, I’ve also added to each a filter on City and selected the relevant city name:

I do not select a Target for these charts, instead, I set the ranges in the settings:

There is a useful academy article on speedometers that details how to add and customize them.

Embedding the dashboard

Once the dashboard exists, great, you have a dashboard that you can see when you login to your Luzmo account. But you may want to have it integrated into another webpage for others to see too. Which is what I wanted to do; for this step, I’ve created cumulio-pollution-landingpage which you can clone and use. To run it:

  1. npm install
  2. Create a file called ‘.env’ in the root directory. Here, fill the CUMULIO_API_KEY and CUMULIO_API_TOKEN fields with the ones from your Luzmo profile. If you don’t have any yet, you can create them in the API Tokens tab in your profile:
  3. Replace dashboardId in public/js/app.js and server.js with your own dashboard ID which you can find on the dashboard editor in Luzmo.
  4. npm run start or node index.js

You can visit your webpage on localhost:3000.

For this section you can have a look at the Integration API Documentation. For the full code you can visit the repo, but here are some of the key points.

As an initial step, I load the Integration API in the header of my webpage:

Next up I decided to add a side bar and a main content element where I would display my dashboard, and load the js/app.js script:

The actual dashboard embedding happens in js/app.js. Here I call the addDashboard function. This function loads and renders the dashboard with the specified id in the specified HTML div, which for me is the ‘dashboard-container’:

I wrap the above addDashboard in a loadInsightsPage function that is called when the window loads:

And finally, one last thing to note is server.js where the /authorization endpoint is defined. It uses Luzmo's Node SDK to request an authorization key & token for the dashboard. The API key and token are first read from the .env file:

Finally, I decided that I’d like to add some extras so as to experiment with filtering from an integrated dashboard. The next section will walk through how I achieved some simple filtering by interacting with the webpage.

Filtering the Dashboard (Extra)

For this final step, I just approached it experimentally so there’s nothing fancy going on. I simply added the list of cities on the sidebar, and filtered the dashboard on that city when clicked:

Result when filtering on Los Angeles

To achieve this, I first added a list of cities to the sidebar that calls a reloadDashboard function on click:

Then I had to modify the getDashboardAuthorizationToken function to accept an input (the city name) which we can add to /authorization and then refreshData with the filtering added to our authorization options:

And that’s it for coding! The only thing remained to do is to add ‘city’ as a parameter to the dashboard itself on Luzmo. Now when the reloadDashboard is called on click, we send meta_data to the dashboard with ‘city’ name, and Luzmo uses the value I send over as its parameter value. To add a parameter, you can go to the FILTERS tab and ‘Create Parameter’ with type Hierarchy[].

I wanted to be able to see all cities on the dashboard editor so added all my cities as default values here. Then I need to use this parameter on the dashboard so on Dashboard Filters ‘Create filter’:

And that’s it 🙂 I now have my own plugin that uses an API, used on a dashboard that I integrate into a webpage and filter from there. Voila ladies and gentlemen:

Useful Resources

Build your first embedded dashboard in less than 15 min

Experience the power of Luzmo. Talk to our product experts for a guided demo  or get your hands dirty with a free 10-day trial.