How to Make Efficient API Calls

This article is related to the PurpleAir API. If you are unfamiliar with it, check out our API Landing Page to get started.

This article outlines many ways that you can reduce the points usage of your API calls. These can involve either lowering the base cost of the call, or avoiding querying unnecessary fields.

Some of these tips or fields listed are only applicable to certain API endpoints


Averaging Periods and Data Resolution

The easiest way you can reduce your point cost is by querying a larger averaging period. For example, changing a request from real-time to hourly results in 30 times less data points, and a similar change in cost.


Modified Since

When querying real-time data from Get Sensors Data or Get Members Data, the “modified_since” parameter can be used to only return data from sensors that have reported since a given timestamp. This can be used with the data_time_stamp for your last call to only receive newly reported data.

The “modified_since” parameter is based on when a sensor has last reported data, while the “last_modified” field contains information on when a sensors’s registration was last changed. Though similarly named, they operate differently.

For example, if we send a request to Get Sensors Data, the response should include an element of metadata called “data_time_stamp.” If we set the modified_since parameter to the data_time_stamp of our last API call, then we will only receive data for sensors that have reported new data since the previous API call.

Note that data_time_stamp is different from the response’s “time_stamp”. time_stamp indicates the time when the response was sent, while data_time_stamp indicates when the response’s data is current until. To accurately obtain all new data since the previous response, you will want to use data_time_stamp and query the API every minute.


Averaged Fields

Many fields, such as pm2.5_atm or temperature, have an averaged form of the field as well as a and b channels available. For historical data fields where A and B channels are available, we always recommend querying the A and B channels separately and averaging the data locally.

This is because if a sensor with two laser counters has an issue with one laser counter, such as a bug that has crawled inside or a failed fan, you will be able to verify data quality by comparing the two channels. This verification process is important for historical data because a sensor’s Confidence Score––confidence––is not available as historical metadata; it is a current data point only.

Additionally, the points cost may be lower since averaged fields cost 2 points per row, while individual channel data is 1 point per row. If a sensor has only reported “temperature_a”, but no data for “temperature_b”, then requesting the averaged field “temperature,” will still deduct 2 points per row of data returned. However, requesting temperature_a and temperature_b separately will only deduct 1 point for temperature_a per row of data returned. Since there is no data for temperature_b, you will not be deducted any points for that field in the returned data.

While many PurpleAir sensors report two channels of PM data, only a few can report two channels of temperature, humidity, and pressure data. Currently, no PurpleAir sensors can report two channels of VOC data.


Group Calls

If you are querying real-time data for many sensors at once, the group endpoints allow you to query data from many sensors at once. This requires that you first create a group and add members to a group. You can then obtain real-time data for all group members with a single request using the Get Members Data endpoint.

This means that instead of the base cost being 1 point for every sensor you query, the base cost will instead only be 5 points for data from the entire group.


Fields That Don’t Update Often

The following fields don’t change often, and typically don’t require frequent API calls.

The field last_modified indicates when the registration for a sensor was last updated. You can keep track of this field for a sensor index, and only request registration related information if the registration has been updated.

Field Name When It Changes
date_created This field will never change for a sensor index
position_rating The position rating only changes when a device is connected to a new WiFi network or has its registration modified.
hardware The hardware detected by the sensor doesn’t change frequently, and typically only changes when a component fails
firmware_version This will change when a device is updated to a newer firmware version. Devices will automatically update when newer firmware becomes available
last_modified This indicates when the registration was last modified
name This can be changed during registration
location_type This can be changed during registration
private This can be changed during registration
latitude This can be changed during registration
longitude This can be changed during registration
altitude This can be changed during registration
led_brightness This can be changed during registration

 

Unused or Rarely Used Fields

Field Name Description
ozone1 An extremely limited number of PurpleAir sensors have ever reported ozone data. At the time of writing, only five sensors can be seen on the map with the “Ozone (ppb)” data layer selected
icon This is a flag reserved for future use to reference an icon for the sensor
pa_latency This field measures the round trip time taken to send air quality data to PurpleAir and receive a response in milliseconds
memory This value is primarily used by PurpleAir for diagnostic information of sensors
analog_input This is the analog voltage on the ADC input of the PurpleAir sensor control board
confidence_manual We recommend using the confidence field instead, as it takes confidence_manual into account
confidence_auto We recommend using the confidence field instead, as it takes confidence_auto into account
primary_id_a A legacy field from when PurpleAir used ThingSpeak
primary_key_a A legacy field from when PurpleAir used ThingSpeak
secondary_id_a A legacy field from when PurpleAir used ThingSpeak
secondary_key_a A legacy field from when PurpleAir used ThingSpeak
primary_id_b A legacy field from when PurpleAir used ThingSpeak
primary_key_b A legacy field from when PurpleAir used ThingSpeak
secondary_id_b A legacy field from when PurpleAir used ThingSpeak
secondary_key_b A legacy field from when PurpleAir used ThingSpeak

 

Calculatable Data

The following fields can be derived from other sensor data using formulas available on the PurpleAir community forums. They are still available on the API, but API users concerned about cost can also locally calculate these values

Name Source Equation
scattering_coefficient Visibility Data Layers
deciviews Visibility Data Layers
visual_range Visibility Data Layers

 

Learn More

API Landing Page
Data Download Tool
Making API Calls with the PurpleAir API

3 Likes