Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
In April 2025, QuantAQ began shipping new MODULAIR systems that are slightly different than previous versions. Newer MODULAIR systems have serial numbers that begin with "MOD-X" and start at serial number MOD-X-00890. If your serial number is lower than 890 and the serial number starts with "MOD-", please use the product manual for the original MODULAIR.
Product manual for the MODULAIR Solar Power System (pre-2025).
Product Name
Solar Power System
SKU(s)
MOD-SOLAR-KIT
94Wh Li-Ion battery with 20W solar panel
The MODULAIR Solar Power System is a plug-and-play solar power and battery combination that allows off-grid use of MODULAIR and MODULAIR-PM products.
This product is no longer manufactured or sold by QuantAQ as of November 2024. This manual is here for current customers and historical records only.
The underlying batteries (manufactured by Voltaic Systems, NY) are certified to:
UN 38.3
IEC 62133
CE
FCC
The Solar Power System includes 1" and 1.5" U-Bolts for mounting both the Battery Bracket and Solar Panel Bracket to a pole or post, but you can use whatever suits your specific mounting needs. The Solar Power System is designed to be mounted to a tripod or circular fence post but can be easily adapted for alternative installations.
It is important to ensure the orientation of the Solar Panel is optimal for your geographic location. If in the northern hemisphere, your panel should be installed facing true south, and if in the southern hemisphere, it should be mounted true north. The panel should be mounted at an angle of between 30 and 45 degrees to optimize charging.
As shipped, our Solar Panel System is optimized to be mounted of poles with diameters between 1.5” to 2.25”.
The first step is to mount the 20W solar panel to the Solar Panel Bracket. Remove the plastic covering from the face of the solar panel and align them so that five mounting holes align with the holes in the bracket. Use the panel mounting screws (Bag 2) to secure the solar panel to the bracket.
Use the four 8-32 screws and nuts (Bag 1) to secure the battery box bracket to the battery box.
Attach the 4' extension cable and attach the end of the cable to the available power input connection on the left-hand side of the base of the Battery Box. At this point, the Solar Panel is connected to the Battery and is ready to mount. Note: make sure the cable is fully inserted into its mate to ensure a good connection and to keep it waterproof.
The final step is to mount the Solar Power System to a tripod, pole, or post. The 1" and 1.5" u-bolts provided in the shipment are one option. If these are not compatible with your specific mounting scenario, additional U-bolts or hose clamps should be obtained.
Reference the bracket dimensions in the Appendix to choose the best mounting hardware for your use case.
Upon mounting, orient the Solar Panel such that sun exposure is maximized (i.e. South facing if in the Northern Hemisphere). Double-check that the solar panel power cable connections are secure and connect the USB-C power cable on the right-hand side of the battery box to your MODULAIR or MODULAIR-PM system.
The mounting area of the solar panel bracket is designed to fit as many possible mounting configurations as possible. Each slot is 10 mm in diameter and ranges from 21 mm to 29 mm in width from center to center. There are also two mounting holes for screws that are each 5 mm in diameter and located 38 mm apart from one another vertically. The two slots in the vertical center of the bracket are each 29 mm by 10 mm and fit U-bolts that can range from 27-85 mm in width. The four vertical slots are each 21 x 10 mm and are placed 75 mm apart horizontally and will fit U-bolts between 25 mm and 67 mm.
The technical drawing for this bracket can be found on the manufacturer’s website .
Dimensions for the battery bracket are in mm. There are three sets of mounting slots for the U-bolts and/or hose clamps to go through. They are centered at 1", 2", and 3.5" apart from one another. They are all 0.55" tall → hose clamps that have a width of 0.5" or less will easily fit.
The QuantAQ Command Line Interface (CLI) tool provides easy-to-use tools to munge data associated with QuantAQ's air quality sensor data.
Check it out on GitHub!
The purpose of the CLI tool is to make data munging a breeze! There are currently built-in functionality to allow you to easily:
concatenate files
merge files
flag data
expunge data
resample data
For more information on usage, check out the complete docs.
To install the most recent release:
For examples and usage, please check out the full documentation page .
This page includes the Smart Solar Power System operating manual.
ETFE Panel Screw and Nut Set
1.5" U-Bolt with Mounting Plate
1" U-Bolt with Mounting Plate
Battery Capacity
26,800 mAh, 94 Wh
Battery Output
5V, 2A
Battery Type
Lithium Ion
Solar Panel
20W, 6V
Operating Range
-15ºC to 60ºC Safe charging range: 0ºC to 45ºC Safe discharging range: -15ºC to 60ºC
Battery in Hammond waterproof case
Solar Panel Mounting Bracket
Battery Box Mounting Bracket
4' Extension cable for solar panels
20W Solar Panel
8-32 Screw with Nut




The Smart Solar Power System is an easy-to-install, long-lasting solar power system with integrated data logging designed for QuantAQ's MOD-X series IoT air quality sensors. The system is pre-installed onto QuantAQ's Solar Pole Mount Kit making installation easy. The battery uses long-life LiFePO4 (LFP) cells and an integrated MPPT charge controller. Battery and Solar Panel health can be monitored from within the QuantAQ Cloud on supported systems.
An optional 5V USB converter cable allows the Smart Solar Power System to be used with older QuantAQ air quality sensors.
Battery
Nominal Capacity
18 Ah / 230 Wh
Max Input Current
10 A
Cell Configuration
4S 3P LFP 32700
Mass
3 kg
Input Connectors
MC4
Standard Output Connector
M12, 4 pin
Solar Panel
The table below includes values for both the 25W and 50W SKUs. If different, the value for the 50W system will be listed after the "/".
Wp - Maximum Power
28.5 W / 56.7 W
Vp - Voltage at Max Power
17.7 V
Voc - Open-Circuit Voltage
20.7 V
Ip - Current at Max Power
1.53 A / 3.2 A
Isc - Short-Circuit Current
1.69 A / 3.37 A
Solar Cell Efficiency
22.8%
Individual components of the battery assembly are certified by the battery vendor. The complete assembly is tested and certified to UN 38.3 and has a complete MSDS. The charge controller is tested and certified to EC62109, IEC62509, and CE. The LFP cells are tested and certified to UL1642.
System Overview
The Smart Solar Power System is shipped pre-assembled to ensure a quick and easy installation process. However, there are a few things to keep in mind:
Mounting Surface. The Smart Solar Power System is designed to be mounted to poles or posts with clear access to sunlight. While it may be possible (use your discretion), we do not recommend installing to horizontal surfaces such as railings.
Orientation. The azimuth and tilt angles at which the Solar Panel is installed is critically important for success and depends on your location and installation situation. We have resources for determining the ideal tilt and azimuth angle for your location (see this link) and season. If you have further questions, please contact support using the in-app chat. If you are installing in an area with obstructions (e.g., urban canyon), you may need to take extra precautions when choosing an ideal installation setup.
When your system arrives, it will be packaged in its shipping box pre-assembled. Once the box is open and the cables and quick-start guide are removed from the top of the box, carefully remove the assembly from the box by lifting underneath the sides of the solar panel and lifting it straight up. Set the assembly aside and cut away the plastic wrapping holding it together. In the box, you should expect to find:
Smart Solar Panel System Assembly
Quick-Start Guide
Parts bag including:
Four (4) 2.5" 1/4"-20 carriage bolts
Four (4) 1/4"-20 hex nuts
Two (2) Mounting Plates
To complete the installation, you will need the following tools:
Please see the unboxing and installation video below for a complete walk-through:
Lift the Solar Panel so that you can access the battery. At the base of the battery, there is a 1/4"-20 hex-head screw holding the battery into place. Remove the screw and set aside.
Near the top of the bracket, you will find two additional 1/4"-20 hex-head screws for securing the tilt angle of the solar panel. Remove those screws and set aside.
If you are mounting to a pole that is <2" in diameter, you can use the provided mounting hardware for installation. If installing to a larger post, you will need to acquire your own mounting hardware that fits the post you are installing to. We recommend hose clamps or metal straps that are no larger than 0.5" wide.
Mounting to a Pole < 2" in Diameter
Pre-set two of the provided carriage bolts in the bracket as shown below:
With the help of a second installer, place the bracket assembly against the post and secure using one of the mounting plates and two of the hex-head nuts:
Once the bracket assembly is installed, adjust the solar panel's tilt angle to the appropriate angle for your location and installation scenario. Secure in place using the two previously-removed 1/4"-20 hex-head screws.
The tilt angles are labeled with each hole representing 10º in additional tilt. Once in place, ensure all four 1/4"-20 screws are tightened.
Attach the two MC4 cables (red and black) from the battery to the corresponding mating part on the Solar Panel:
Secure the cables in place using either a zip-tie or by slotting them into the cutouts in the bracket as shown above. You may need to adjust the upper part of the cable by tugging it throught the grommet near the top for a better fit.
At this point, the panel and battery are installed. However, the battery itself is not active until the M12 power output cable is connected at which point the battery will become activated.
At the base of the battery pack, there is a series of three LEDs that indicate the operational status of the panel and battery. Complete documentation of the error codes can be found in Section 4.2. If you are installing the system while it's light out, you should expect to see the following:
Green: either solid (System On, Not Charging) or flashing slow (Charging)
The frequency of maintenance for the Smart Solar Power System depends on your location and environment. We recommend the following maintenance schedule:
Manual Inspection
Quarterly
Inspect the system to ensure no cables are broken or damaged and the panel is intact (e.g., the glass isn't broken). If damage is present, please get in touch with support.
Panel Cleaning
Quarterly
Wipe down the Solar Panel with a damp cloth to remove any dust, dirt, or other debris.
The bounding box for the 25W solar panel is 507 mm x 307 mm x 30 mm.
The bounding box for the battery is 100 mm x 237 mm x 104.2 mm.
The battery includes a 3-LED array indicating the solar power system's operational status.
Green
Solid
System On, Not Charging
Flashing Slow
Charging
Flashing Fast
MPPT/Optimized Charging
Amber
Solid
System On
January 1st, 2025
This is the first release of this document.
Product Name
Smart Solar Power System
SKU(s)
SOL-SM-V102-25W
18Ah LiFePO4 battery with 25W panel
SOL-SM-V102-50W
18Ah LiFePO4 battery with 50W panel
$ pip install -U quantaq-cliMounting to a Post > 2" in Diameter
If you are mounting to a larger post, please follow the instructions in the following video:
If your QuantAQ air quality sensor has a 5V USB-C power input, you will need to use the 5V DC converter cable to interface with the Smart Solar Power System. Remove the protective sheet on the double-sided tape and secure the converter cable to the side of the battery. Plug the M12 cable into the M12 cable of the battery and plug the USB-C cable into your sensor.
Amber: Solid (System On)
Red: Off
Input Voltage Range
14.5 V - 25 V
Output Temperature Range
-20º - 60ºC
Input Temperatute Range
0º - 45ºC
Standard Output Voltage Range
12.4 V - 14.6 V
Protections
Short Circuit, Over Discharge, Over Temperature, Under Temperature
Certifications
CE, FCC, RoHS, UN 38.3
Number of Cells
30
Mass
2 kg / 3.4 kg
Connector Type
MC4
Temperature Range
-40º - 85ºC
Flashing Slow
Low Battery Voltage
Flashing Fast
Low Battery Protection
Red
Solid
No Output
Flashing Slow
Over Temperature Protection
Flashing Fast
Short Circuit / Overload Protection





Product manual for the 2025 generation of MODULAIR (i.e., MODULAIR-X).
Product Name
MODULAIR
SKU(s)
MOD-X-015-NORAM
For use in North America
MOD-X-015-GLOBAL
For use outside North America
MODULAIR™ provides real-time estimates of particulate matter concentrations (PM1, PM2.5, and PM10), the particle size distribution, and four gas-phase pollutants (CO, NO, NO2, O3). MODULAIR™ uses the same patented particle measurement technology found in the MODULAIR-PM, which combines nephelometry with single-particle scattering to accurately measure aerosol loadings across a variety of environments.
MODULAIR™ is designed as an internet-connected device and does not work as intended without an internet connection. All MODULAIR™ devices are multi-radio and come equipped with an LTE modem and Wi-Fi, and can seamlessly transition between the two radios.
MODULAIR™ is designed to work with QuantAQ's add-on systems, including the and .
MODULAIR™ is protected by US Patent No. US 12,265,007 as well as multiple pending patents.
For more information on the operating principle and performance of the MODULAIR, please refer to the following technical notes:
QAN-003:
QAN-004:
The MODULAIR™ air quality sensor complies with part 15 of the FCC rules for class A devices. Operation is subject to the following two conditions: (1) this device may not cause harmful interference; (2) this device must accept any interference received, including interference that may cause undesired operation. The MODULAIR™ contains a pre-certified multi-radio modem (2AEMI-M404).
Below is a top-down view of the MODULAIR. Air flows in through the port on the sensor base (Figure 2.2) and flows out the upper-right side of the sensor.
The base of the MODULAIR highlights the air inlet port (center) and the three connection ports:
M8 4P Solar Comms. The upper-left port is for connecting the M8 RS-485 communication cable between the Smart Solar Power System (if purchased) and the MODULAIR. If not in use, ensure the M8 dust cap is in place to prevent damage to the instrument.
M12 4P Power. The lower-left port is for connecting the M12 power cable from either the Smart Solar Power System or the provided 12V power cable.
M12 5P Weather Station. The port on the right side is for connecting a supported Gill Weather Station. If not in use, ensure the M12 dust cap is in place to prevent damage to the instrument.
The front panel of the MODULAIR can be accessed by opening the lid of the enclosure. The panel provides access to the power switch, SD card, and Status LED, all of which are shown in Figure 2.3.
To access the Core Board, open the front panel after unscrewing the screw located just above the µSD card. Once open, you can access the mode and reset buttons and the USB debugging port for streaming logs. When closing the lid, make sure it is aligned such that you do not break off the µSD card slot.
When unpacking your MODULAIR, you should expect to find the following:
MODULAIR Air Quality Sensor
12V, 2A USB-C Power Brick
USB-C to M12 Power Cable
Device Registration Card
If any of these components are missing, please contact QuantAQ Support via the in-app chat.
Each device ships with a Registration Card containing a QR code and a short confirmation code. Follow the instructions below to register your device:
The MODULAIR should be mounted using the provided Pole Mount Kit. The Pole Mount Kit is designed to be installed using either the provided back plates and carriage bolts for smaller posts or hose clamps for larger posts. If an existing pole or post is not available in the location where you will be installing your sensor, we recommend acquiring a tripod or similar.
To physically install your sensor, follow these instructions:
There are three ways in which you can access data for the MODULAIR:
Raw, 5-second data is stored locally on the µSD card
Data can be downloaded as a CSV via the QuantAQ Cloud console
Data can be downloaded via the QuantAQ Cloud API
The data formats are slightly different, though largely consistent. Each approach is documented below.
Table 4.1 below documents the columns available in the downloaded data and what they mean.
Data are pushed to the QuantAQ Cloud with 1-minute time resolution and can be downloaded via the API or via the web app as a CSV. When downloading data, you can select whether you would like to download the raw data, final data, or raw+final data. Generally, the final data is what is desired, as it contains the final, cleaned data that is ready for analysis. The raw data is well-suited for researchers trying to investigate specific questions. When downloaded, the data is exported as a CSV and contains the following columns:
There are no consumable or user-replaceable components to the MODULAIR. If you believe a component is broken or not functioning correctly, please contact Customer Support via the in-app chat.
Additional maintenance and service recommendations are coming soon.
Please see our for a full history of all firmware changes.
Nitrogen Oxide (NO)
0 to 2,500 ppb
5 ppb or 35%
Nitrogen Dioxide (NO2)
0 to 2,500 ppb
5 ppb or 35%
Fill out the form presented on your screen.
Using the four provided 3/8" 10-32 screws, partially screw install each one into the fasteneres in each corner of the back of the MODULAIR.
Plug in the M12 to USB-C power cable, open the front panel of the MODULAIR, and turn the device on by pushing the power switch into the on position.
At this point, the Status LED on your MODULAIR will begin to blink, and within a few minutes, should begin breathing cyan, which indicates everything is working.
sample_temp
ºC
The in-box temperature
sample_rh
%
The in-box relative humidity
bin0
p/cm3
Number of particles per cubic cm in the OPC's bin0 (0.35 - 0.46 µm)
bin1
p/cm3
Number of particles per cubic cm in the OPC's bin1 (0.46 - 0.66 µm)
bin2
p/cm3
Number of particles per cubic cm in the OPC's bin2 (0.66 - 1.0 µm)
bin3
p/cm3
Number of particles per cubic cm in the OPC's bin3 (1.0 - 1.3 µm)
bin4
p/cm3
Number of particles per cubic cm in the OPC's bin4 (1.3 - 1.7 µm)
bin5
p/cm3
Number of particles per cubic cm in the OPC's bin5 (1.7 - 2.3 µm)
bin6
p/cm3
Number of particles per cubic cm in the OPC's bin6 (2.3 - 3.0 µm)
bin7
p/cm3
Number of particles per cubic cm in the OPC's bin7 (3.0 - 4.0 µm)
bin8
p/cm3
Number of particles per cubic cm in the OPC's bin8 (4.0 - 5.2 µm)
bin9
p/cm3
Number of particles per cubic cm in the OPC's bin9 (5.2 - 6.5 µm)
bin10
p/cm3
Number of particles per cubic cm in the OPC's bin10 (6.5 - 8.0 µm)
bin11
p/cm3
Number of particles per cubic cm in the OPC's bin11 (8.0 - 10.0 µm)
bin12
p/cm3
Number of particles per cubic cm in the OPC's bin12 (10.0 - 12.0 µm)
bin13
p/cm3
Number of particles per cubic cm in the OPC's bin13 (12.0 - 14.0 µm)
bin14
p/cm3
Number of particles per cubic cm in the OPC's bin14 (14.0 - 16.0 µm)
bin15
p/cm3
Number of particles per cubic cm in the OPC's bin15 (16.0 - 18.0 µm)
bin16
p/cm3
Number of particles per cubic cm in the OPC's bin16 (18.0 - 20.0 µm)
bin17
p/cm3
Number of particles per cubic cm in the OPC's bin17 (20.0 - 22.0 µm)
bin18
p/cm3
Number of particles per cubic cm in the OPC's bin18 (22.0 - 25.0 µm)
bin19
p/cm3
Number of particles per cubic cm in the OPC's bin19 (25.0 - 28.0 µm)
bin20
p/cm3
Number of particles per cubic cm in the OPC's bin20 (28.0 - 31.0 µm)
bin21
p/cm3
Number of particles per cubic cm in the OPC's bin21 (31.0 - 34.0 µm)
bin22
p/cm3
Number of particles per cubic cm in the OPC's bin22 (34.0 - 37.0 µm)
bin23
p/cm3
Number of particles per cubic cm in the OPC's bin23 (37.0 - 40.0 µm)
bin1MToF
ml/s
Time of flight for particles in OPC bin1
bin3MToF
ml/s
Time of flight for particles in OPC bin3
bin5MToF
ml/s
Time of flight for particles in OPC bin5
bin7MToF
ml/s
Time of flight for particles in OPC bin7
opc_sample_flow
ml/s
OPC sample flow rate
opc_temp
ºC
The internal temperature of the OPC
opc_rh
%
The internal relative humidity of the OPC
opc_pm1
µg/m3
The factory-computed PM1 value for the OPC
opc_pm25
µg/m3
The factory-computed PM2.5 value for the OPC
opc_pm10
µg/m3
The factory-computed PM10 value for the OPC
opc_laser_status
The laser power of the OPC
neph_bin0
p
Number of particles in bin0 of the nephelometer
neph_bin1
p
Number of particles in bin1 of the nephelometer
neph_bin2
p
Number of particles in bin2 of the nephelometer
neph_bin3
p
Number of particles in bin3 of the nephelometer
neph_bin4
p
Number of particles in bin4 of the nephelometer
neph_bin5
p
Number of particles in bin5 of the nephelometer
neph_pm1_std
µg/m3
The factory computed value for PM1 from the Nephelometer
neph_pm25_std
µg/m3
The factory computed value for PM2.5 from the Nephelometer
neph_pm10_std
µg/m3
The factory computed value for PM10 from the Nephelometer
neph_pm1_env
µg/m3
The factory computed value for PM1 from the Nephelometer
neph_pm25_env
µg/m3
The factory computed value for PM2.5 from the Nephelometer
neph_pm10_env
µg/m3
The factory computed value for PM10 from the Nephelometer
dd_operating_state
The operating state of the DualDetector
dd_measurement_state
The measurement state of the DualDetector
wx_ws
m/s
Vector wind speed measured by the Gill weather station, if equipped
wx_wd
deg
Wind direction measured by the Gill weather station, if equipped
wx_ws_scalar
m/s
Scalar wind speed measured by the Gill weather station, if equipped
wx_u
u component of the wind speed and direction measured by the Gill weather station, if equipped
wx_v
v component of the wind speed and direction measured by the Gill weather station, if equipped
wx_pressure
hPa
Ambient pressure measured by the Gill weather station, if equipped
wx_temp
ºC
Ambient temperature measured by the Gill weather station, if equipped
wx_rh
%
Ambient relative humidity measured by the Gill weather station, if equipped
wx_dew_point
ºC
Dew point measured by the Gill weather station, if equipped
co_we
mV
Working electrode signal for the CO sensor
co_ae
mV
Auxiliary electrode signal for the CO sensor
no_we
mV
Working electrode signal for the NO sensor
no_ae
mV
Auxiliary electrode signal for the NO sensor
no2_we
mV
Working electrode signal for the NO2 sensor
no2_ae
mV
Auxiliary electrode signal for the NO2 sensor
o3_we
mV
Working electrode signal for the O3 sensor
o3_ae
mV
Auxiliary electrode signal for the O3 sensor
sn
The device serial number
device_state
The device state
lat
The device location, latitude
lon
The device location, longitude
sample_rh
%
The in-box relative humidity
sample_temp
ºC
The in-box temperature
wx_ws
m/s
Vector wind speed measured by the Gill weather station, if equipped
wx_wd
deg
Wind direction measured by the Gill weather station, if equipped
wx_ws_scalar
m/s
Scalar wind speed measured by the Gill weather station, if equipped
wx_u
u component of the wind speed and direction measured by the Gill weather station, if equipped
wx_v
v component of the wind speed and direction measured by the Gill weather station, if equipped
wx_pressure
hPa
Ambient pressure measured by the Gill weather station, if equipped
wx_temp
ºC
Ambient temperature measured by the Gill weather station, if equipped
wx_rh
%
Ambient relative humidity measured by the Gill weather station, if equipped
wx_dew_point
ºC
Dew point measured by the Gill weather station, if equipped
bin0
p/cc
Number of particles per cubic cm in the OPC's bin0 (0.35 - 0.46 µm)
bin1
p/cc
Number of particles per cubic cm in the OPC's bin1 (0.46 - 0.66 µm)
bin2
p/cc
Number of particles per cubic cm in the OPC's bin2 (0.66 - 1.0 µm)
bin3
p/cc
Number of particles per cubic cm in the OPC's bin3 (1.0 - 1.3 µm)
bin4
p/cc
Number of particles per cubic cm in the OPC's bin4 (1.3 - 1.7 µm)
bin5
p/cc
Number of particles per cubic cm in the OPC's bin5 (1.7 - 2.3 µm)
bin6
p/cc
Number of particles per cubic cm in the OPC's bin6 (2.3 - 3.0 µm)
bin7
p/cc
Number of particles per cubic cm in the OPC's bin7 (3.0 - 4.0 µm)
bin8
p/cc
Number of particles per cubic cm in the OPC's bin8 (4.0 - 5.2 µm)
bin9
p/cc
Number of particles per cubic cm in the OPC's bin9 (5.2 - 6.5 µm)
bin10
p/cc
Number of particles per cubic cm in the OPC's bin10 (6.5 - 8.0 µm)
bin11
p/cc
Number of particles per cubic cm in the OPC's bin11 (8.0 - 10.0 µm)
bin12
p/cc
Number of particles per cubic cm in the OPC's bin12 (10.0 - 12.0 µm)
bin13
p/cc
Number of particles per cubic cm in the OPC's bin13 (12.0 - 14.0 µm)
bin14
p/cc
Number of particles per cubic cm in the OPC's bin14 (14.0 - 16.0 µm)
bin15
p/cc
Number of particles per cubic cm in the OPC's bin15 (16.0 - 18.0 µm)
bin16
p/cc
Number of particles per cubic cm in the OPC's bin16 (18.0 - 20.0 µm)
bin17
p/cc
Number of particles per cubic cm in the OPC's bin17 (20.0 - 22.0 µm)
bin18
p/cc
Number of particles per cubic cm in the OPC's bin18 (22.0 - 25.0 µm)
bin19
p/cc
Number of particles per cubic cm in the OPC's bin19 (25.0 - 28.0 µm)
bin20
p/cc
Number of particles per cubic cm in the OPC's bin20 (28.0 - 31.0 µm)
bin21
p/cc
Number of particles per cubic cm in the OPC's bin21 (31.0 - 34.0 µm)
bin22
p/cc
Number of particles per cubic cm in the OPC's bin22 (34.0 - 37.0 µm)
bin23
p/cc
Number of particles per cubic cm in the OPC's bin23 (37.0 - 40.0 µm)
opc_pm1
µgm-3
The factory-computed PM1 value for the OPC
opc_pm25
µgm-3
The factory-computed PM2.5 value for the OPC
opc_pm10
µµgm-3
The factory-computed PM10 value for the OPC
pm1_env
µgm-3
The factory computed value for PM1 from the Nephelometer
pm25_env
µgm-3
The factory computed value for PM2.5 from the Nephelometer
pm10_env
µgm-3
The factory computed value for PM10 from the Nephelometer
neph_bin0
p
Number of particles in bin0 of the nephelometer
dd_operating_state
The operating state of the DualDetector
co_we
mV
Working electrode signal for the CO sensor
co_ae
mV
Auxiliary electrode signal for the CO sensor
co_diff
mV
Difference between working and auxiliary electrodes for the CO sensor
no_we
mV
Working electrode signal for the NO sensor
no_ae
mV
Auxiliary electrode signal for the NO sensor
no_diff
mV
Difference between working and auxiliary electrodes for the NO sensor
no2_we
mV
Working electrode signal for the NO2 sensor
no2_ae
mV
Auxiliary electrode signal for the NO2 sensor
no2_diff
mV
Difference between working and auxiliary electrodes for the NO2 sensor
o3_we
mV
Working electrode signal for the O3 sensor
o3_ae
mV
Auxiliary electrode signal for the O3 sensor
ox_diff
mV
Difference between working and auxiliary electrodes for the O3 sensor
pm1
µgm-3
Final PM1 value
pm25
µgm-3
Final PM2.5 value
pm10
µgm-3
Final PM10 value
co
ppb
Final CO value
no
ppb
Final NO value
no2
ppb
Final NO2 value
o3
ppb
Final O3 value
Datasheet
PM1, PM2.5, PM10
0 to 2,000 µg/m3
Please refer to spec sheet.
Particle Size Distribution
0.35 to 40.0 µm (24 size bins)
Not yet determined.
Ozone (O3)
0 to 250 ppb
5 ppb or 20%
Carbon Monoxide (CO)
0 to 13,000 ppb
70 ppb or 20%
🔋 Power
12V 1.25W average consumption
🗼 Communication
North America LTE Cat M1 with 2G fallback Wi-Fi (2.4 GHz or 5 GHz) Global LTE Cat 1 with 2G/3G fallback Wi-Fi (2.4 GHz or 5 GHz)
📈 Data
Web interface (quant-aq.com) Programmatic access (QuantAQ API) Local storage (µSD Card)
Weatherproof rating
IP67
Operating temperature
-20º to 45ºC
Operating humidity
5 to 95%, non-condensing
Dimensions
11.04" x 9.04" x 5.72"
Weight
6 lbs (2.72 kg)
Pole Mount Kit with Back Plates
1.25" - 2"
Pole Mount Kit with Hose Clamps or Straps
2" - 6"
timestamp
The sample timestamp in ISO format
fw
The current firmware version
flag
The status flag corresponding to this record
soc
%
The state of charge of the onboard LiPo battery
timestamp
The sample timestamp in ISO format
timestamp_local
The local sample timestamp in ISO format
id






The record ID
This page includes the operating manual for the Gill MaxiMet GMX200 and GMX500 weather stations.
QuantAQ supports the integration of Gill MaxiMet weather stations with MODULAIR (X-series) products. Gill MaxiMet sensors are robust and have no moving parts. The stations are directly integrated with MODULAIR for direct data communication and fully integrated into the QuantAQ Cloud.
QuantAQ currently supports two weather station models (GMX200, GMX500) as documented in the table at the top of this page. The GMX200 offers wind speed and wind direction measurements, whereas the GMX500 offers wind speed and wind direction as well as ambient temperature, pressure, and relative humidity.
Further details can be found in the Gill MaxiMet product manual.
Wind Speed
Range
0-60 m/s
Accuracy
0-10 m/s 0.3 m/s RMSE 10-40 m/s 3% RMSE 40-60 m/s 5% RMSE
Resolution
Input Voltage
5V
5V
Construction
UV stabilized plastic
UV stabilized plastic
Weight
0.5 kg
0.7 kg
Connector Type
9-way clipper connector
9-way clipper connector
Gill products carry FCC, CA, and CE certifications for the MaxiMet product line.
The Weather Station is shipped partially pre-assembled to ensure a quick and easy installation process. However, there are a few things to keep in mind:
Siting. Avoid turbulence caused by surrounding structures that will affect the measurement, such as trees, buildings, or even posts or poles. The exact location and manner in which you site your weather station depends on your constraints and measurement goals. Please see section 2.3 for more information and guidance.
Orientation. The weather station should be mounted horizontally and vertically as level as possible.
Pole or Post Diameter. The mounting bracket that ships with the weather station is designed to sit at the top of a pole or post with diameters between 1.5" and 2.5" in diameter. If this does not work for your use case, please contact QuantAQ Support for further information and drawings.
When your weather station arrives, it will be packaged in its shipping box, partially pre-assembled. Once the box is open, remove the mounting bracket, cable, and parts bag and set them aside. In the box, you should expect to find:
Gill MaxiMet Weather Station (separately packaged within the box)
Parts bag including:
Four (4) 1/4"-20 2.5" bolts
One (1) mounting back plate
Three (3) 10MM M5 screws
Three (3) M6 single-wave washers
9-pin clipper connector cable to 4P M12 cable
Assembled mounting bracket and post
Tools required:
Adjustable or 3/8" wrench or socket for the 1/4"-20 bolts
4MM hex driver to secure the mounting screws between the weather station and mounting post
zip ties to secure the cable to the mounting bracket
Connect the 9-pin clipper connector to the base of the MaxiMet weather station. To do so, align the 9-pins to the 9-pin connector on the base of the weather station and twist the top part of the clipper connector until it locks.
Once the cable is connected to the weather station, place the M12-end of the cable through the top of the mounting post, allowing the cable to drop through the bottom of the mounting post. Orient the weather station such that the three holes along the bottom of the weather station align with the three tapped holes in the mounting post. Secure the weather station using the three M5 screws and single-wave washers.
Using a zip-tie or similar, secure the cable to the mounting bracket to provide strain relief.
Using the four (4) 1/4"-20 bolts, secure the Back Plate to the main Bracket by tightening the four bolts evenly until the Bracket is secured. For recommendations on siting, please see Section 2.3. Directionality of the sensor does not matter.
All supported MaxiMet weather stations contain a 2-axis flux gate compass. The internal compass electronically senses the horizontal component of Earth's magnetic field. Information from the compass is used to correct the wind direction in instances where the weather station is not aligned to North.
When siting an ultrasonic wind sensor, it is important to ensure that the location is free from obstructions such as trees, buildings, and other structures that might cause wind disturbances. The sensor should be positioned at a height that is representative of the area’s typical wind conditions. Proper alignment and leveling of the sensor will further enhance the accuracy of wind speed and direction measurements. By taking these factors into account, you can ensure that the ultrasonic wind sensor provides reliable data for meteorological analysis.
The World Meteorological Organization makes the following recommendations:
The standard exposure of wind instruments over level open terrain is 10m above the ground. Open terrain is defined as an area where the distance between the sensor and any obstruction is at least 10 times the height of the obstruction.
If mounting on a building, then theoretically the sensor should be mounted at a height of 1.5 times the height of the building.
While the above recommendations are worth considering, it is likely you will need to find a site and mounting strategy that is practical without perturbing your measurement too much. If you are mounting the weather station such that a pole extends beyond the height of the weather station, the boom (distance from the pole or post) should be at least twice as long as the diameter of the pole.
For further recommendations on siting weather stations, please see the following resources:
Product Name
Weather Station
SKU(s)
Gill's MaxiMet GMX200 compact weather station.
Gill's MaxiMet GMX500 compact weather station.

To make data analysis easier, QuantAQ maintains several software programs designed to reduce the time it takes for you to go from data to insight. Below, we highlight several tools and their purpose:
QuantAQ CLI
The QuantAQ CLI is a simple Python-based tool for cleaning, munging, and interacting with data from QuantAQ devices.
py-smps
py-smps is a Python library for manipulating and analyzing size-resolved particle data from OPCs, SMPS, or other particle sizing instruments.
atmospy
atmopsy is a Python library for analyzing and visualizing air quality data.
py-quantaq
py-quantaq is a simple API wrapper for the QuantAQ Cloud API. It is the recommended method for downloading or interacting with data or devices when using Python.
As all QuantAQ products are internet-connected, it is important to consider connectivity when choosing an installation location. There are three primary things to consider:
Antenna Connection. If your device has an external antenna, ensure it is seated securely and placed at a 90º angle pointing toward the sky.
Antenna Placement. Do not place the device near metal objects or other sources of RF (i.e., antenna). Keep the antenna at least 18" away from metal objects as they can cause distortions and reflections.
Location and Cellular Availability. Install your sensor in a location with a known cellular signal on the carriers we support.
0.01 m/s
Wind Direction
Range
0-360ºC
Accuracy
0.5 m/s - 40 m/s ±3º 40 m/s - 60 m/s ±5º
Resolution
1º
Air Temperature
Range
-40ºC to +70ºC
Accuracy
±0.3º
Resolution
0.1ºC
Relative Humidity
Range
0-100% RH
Accuracy
typically ±2% RH across full range
Resolution
0.1% RH
Barometric Pressure
Range
300 - 1250 hPa
Accuracy
Absolute (typically) ±0.4hPa Relative (typically) ±0.08 hPa
Resolution
0.1 hPa
Protection Class
IP66
IP66
Operating temp.
-35ºC to 70ºC
-35ºC to 70ºC



r-quantaq
r-quantaq is a simple API wrapper for the QuantAQ Cloud API. It is the recommended method for downloading or interacting with data or devices when using R.
Data is collected and saved to an onboard µSD card every 5- 10 seconds (depending on product SKU). Each minute, these values are averaged and pushed to the QuantAQ Cloud, where they are available for you to view, interact with, and download. It is unlikely you will ever need the locally stored data, but it is available to you if you would like to use it.
On the µSD card, you will find data files with file names like DATA_{YYYYMMDD}@FW{VERSION}.csv where YYYYMMDD represents the UTC date and VERSION represents the firmware version of the device. In the event a firmware update happens, a new file for that date will be created.
Data files are written each day and can be read or analyzed using any programming language or spreadsheet program (e.g., Microsoft Excel). Each file begins with three metadata rows describing the device model (row 1), device ID (row 2), and device serial number (row 3). Row 4 contains the data column headers, and rows 5 and higher contain data. Each row corresponds to a new record.
Please note that configuring Wi-Fi is *not* required for operation. All MODULAIR devices have cellular modems, and Wi-Fi is a fallback in the event you are operating in an area that does not have a reliable cellular connection.
To configure Wi-Fi credentials for your device, use our web-based configuration tool or visit https://app.quant-aq.com/wifi-setup. Complete instructions can be found in our Help Center. The MODULAIR can store up to ten separate credentials before they begin to be overwritten.
Product manual for the MODULAIR-PM.

Datasheet
MODULAIR™-PM provides real-time estimates of particulate matter concentrations (PM1, PM2.5, and PM10) and particle size distribution using a novel combination of multiple light-scattering-based particle sensors (patent pending).
PM1, PM2.5, PM10
0 to 2,000 µg/m3
Please see the spec sheet.
Particle size distribution
0.35 to 40.0 µm (24 bins)
Not yet determined
Temperature*
-40º to 85º C
+/- 0.2ºC
Relative Humidity*
0 to 100%
+/- 2%
*Temperature and relative humidity are measured inside the flow cell and should not be interpreted as true ambient measurements.
For more information on the operating principle and performance of the MODULAIR-PM, please refer to QAN-001 and QAN-003.
🔋 Power
5V, 2A (supply) 250 mA average consumption
🗼 Communication
LTE (North America) 3G/2G (Global)
📈 Data
Web interface (quant-aq.com) Programmatic access (QuantAQ API) Local storage (µSD Card)
Weatherproof rating
IP68
Operating temperature
-20º to 45ºC
Operating humidity
5 to 95%, non-condensing
Dimensions
6.59" x 6.59" x 5.11"
Weight
4 lbs (1.8 kg)
The MODULAIR™-PM air quality sensor complies with part 15 of the FCC rules for class A devices. Operation is subject to the following two conditions: (1) this device may not cause harmful interference; (2) this device must accept any interference received, including interference that may cause undesired operation.
Model: MODULAIR-PM
Contains FCC ID: 2AEMI-BRN402
The MODULAIR-PM complies with European Union EMC Directive 2014/30/EU and conforms to the following technical standards (EN 55011, EN 61326).
When you unpack your device, you should have received the following:
MODULAIR-PM Particulate Matter Sensor
Power supply and USB-C power cable
Mounting hardware (flanges with 4 10-32 screws)
16 GB µSD card
If any of these components are missing, please contact QuantAQ via support.quant-aq.com. If the shipping box contains multiple devices, you will receive the correct multiple of each component from the list above.
The front panel of the device can be accessed by opening the lid of the enclosure. The panel provides access to the ON/OFF switch, Menu button, and LED indicator. Each component is labeled in Figure 2.1.
Underneath the front panel (which can be opened by removing the four No. 6 screws in the four corners), you will find the Core Circuit Board and µSD circuit board. While it is unlikely you will ever need to touch this, it is worth pointing out a few key components.
The MODULAIR-PM is shipped completely assembled, aside from the mounting hardware. Once the device is mounted and you have verified the power switch is in the OFF position, simply plug in the power supply and connect the USB-C cable in to the bottom of the device. Once the power cable is connected, simply flip the power switch to the ON position. Upon receiving power, the LED indicator (Figure 1) will flash green and eventually begin a sequence of slowly breathing cyan; this indicates the cellular connection is active and a session with the cloud server has begun. If the device is being powered on in a new location or has been powered off for an extended period of time, this may take some time to complete. The device will log data locally during this period and push the data to the server once a connection is established. If the LED indicator does not eventually begin breathing cyan, this indicates a cloud connectivity problem. Common errors and next steps can be found in Section 6.2.
To register your device, scan the QR code that is on the registration card you received with your device. It is easiest to complete this step using a cellphone or tablet with a working internet connection. A laptop with a functioning camera will also work, though may be more difficult. It is also suggested that you first log in to the website on the device you will use to complete this process. To register your device:
Use your camera to scan the QR code. This will open a tab in your default browser and will direct you to the device registration page.
Enter the fields for the information that the form asks for and click "Continue"
Enter the claim code found on the same QR code card - it should be a 6-character alphanumeric code.
Follow the instructions on the form and enter in data for the device location and other metadata. All of these can be changed in the future through the dashboard, so don't worry if you can't answer all questions at this time.
The device can be mounted in a number of ways depending on the exact use and available mounting options available to you. The device is shipped with mounting flanges which can be used to easily mount the device to a number of surfaces. Each flange is secured to the back of the device with two 10-32 x 0.75" stainless steel screws (included). Each flange includes three slots with the dimensions found below.
Common installation approaches include:
using high-strength zip ties to secure the device to a fence or post
using screws to mount the device using the provided flanges
The complete box dimensions are:
7.04" x 7.04" x 5.72" (178.82 mm x 178.82 mm x 145.29 mm)
If a more secure approach is needed, a pole mount kit can be purchased directly from the supplier of the enclosures (Polycase part number PL-087).
There are three primary ways in which data can be accessed for the MODULAIR-PM:
Raw data is stored locally on the µSD card
Data can be downloaded from the QuantAQ Cloud Console
Data can be downloaded from the QuantAQ API
The data formats are slightly different depending on which method you’ve used to access the data, each of which is documented below.
Data is collected and saved to the onboard µSD card every five seconds; every minute, these values are averaged and pushed to the cloud where they are available on the QuantAQ Cloud. It is unlikely you will ever need to use the locally saved data; however, it is there in case you need it. This section covers the locally stored data and how to understand it. When removing the µSD card to pull the data, make sure your device is turned OFF.
On the µSD card, you will find data files (with a prefix of DATA_YYYYMMDD.csv) and log files which are located in the logs directory. Log files contain debugging information about the onboard sensors and the cellular communications module. It is unlikely these logs will be useful to most users, though they are available to you if you would like to view them. It is highly recommended that you use the QuantAQ CLI (discussed below) to analyze them, as it will vastly reduce the amount of time needed.
Data files are written each day and can be read or analyzed using any programming language or spreadsheet program (e.g., Microsoft Excel). Each file begins with three meta-data rows describing the device model (row 1), device ID (row 2), and device serial number (row 3). If you are automating your data analysis, you can skip these three rows. The fourth row contains the header information with the names for all columns. The remaining rows contain the data, where each row corresponds to a new 5-second sampling interval. The table below summarizes the columns.
timestamp_iso
The sample timestamp in ISO format
sample_rh
%
Sample relative humidity
sample_temp
ºC
Sample temperature
bin0
p/cm3
Number of particles per cubic cm in bin0 (0.35 - 0.46 µm)
Data are pushed to the QuantAQ Cloud with 1-minute time resolution and can be downloaded via the QuantAQ Cloud Console. When downloading data, you can select whether you would like to download the raw data, the final data, or both the raw+final data. Generally, the final data is what is desired, as it contains the final, cleaned data that is ready for analysis. The raw data is well-suited for researchers trying to investigate specific questions. When downloaded, the data is exported as a csv and contains the following columns:
timestamp
The sample timestamp in ISO format
timestamp_local
The sample timestamp in ISO format, corrected for the timezone as defined in the device settings
id
A unique id the corresponds to the record shown
sn
The device serial number
Data are available via the QuantAQ API at a 1-minute recording interval → the data available are the exact same as those available via the QuantAQ Cloud Console discussed above. The API is designed to allow engineers to build applications and map layers powered by the QuantAQ platform; however, it can also be a good way to automate data downloads, especially for large teams or lengthy download intervals. The data format is slightly different, as outlined below.
Each API call will return a paginated list of json objects with two keys: data and metaand will look something like the following:
The key definitions can be described as:
first_url: The unique url for the first page of data in the query
last_url: The unique url for the last page of data in the query
next_url: The unique url for the next page of data in the query
prev_url: The unique url for the previous page of data in the query
page: The current page number
pages: The total number of pages available for the query
per_page: The number of data objects per page
total: The total number of data objects in the query
The data object contains a list of all individual data objects for that page of data. You can query either the raw or the final data, both of which have different data values available. The final endpoint will return the following:
It contains several objects including the geo, met, and model objects. The descriptions of the individual data points are mapped to their respective columns in Section 3.1.2 above.
Note: If nothing appears in the right-hand column, the variable definition/name is the same
geo.lat
lat
geo.lon
lon
met.pressure
pressure
met.rh
sample_rh
met.temp
sample_temp
model.pm.pm1
pm1_model_id
model.pm.pm25
pm25_model_id
For raw data, the template is similar, but the columns are slightly different as described below.
flag
geo.lat
lat
geo.lon
lon
met.pressure
pressure
met.rh
sample_rh
met.temp
sample_temp
neph.bin0 through neph.bin5
neph_bin0 through neph_bin5
Each row of data contains a single-byte data flag that describes the current state of the device. Flags are stored as unsigned integers and contain encoded information about each of the sensors onboard. They are generated via a bitmask and can be decoded by reversing the procedure. To determine whether a specific flag is set, you can use the bitwise AND operation. If the flag's value is returned, then it is set. If a zero is returned, it is not set. This can seem complicated, so let's clear it up with a simple example.
Let's assume the value of the flag column is set to 4. We can perform a bitwise AND operation to check the result to see if FLAG_STARTUP was set (it wasn't). Below, we will check to see if the flag for the nephelometer is set (it is!).
The following table describes the flags, their value, and what they mean.
FLAG_STARTUP
1
This flag is set when the device powers on.
Remove any rows where this flag is set.
FLAG_OPC
2
This flag is set when the OPC has indicated the data failed to transfer correctly. This can be caused by the fan being off, the laser being off, or the checksum not validating properly.
Remove any rows where this flag is set.
FLAG_NEPH
4
This flag is set when the nephelometer has indicated the data failed to transfer correctly.
Remove any rows where this flag is set.
FLAG_RHTP
8
This flag is set when the relative humidity and temperature sensor has failed.
Remove any rows where this flag is set.
To make data analysis easier, QuantAQ maintains several software programs designed to reduce the time you spend munging and cleaning your data. The most relevant piece of software is going to be the QuantAQ CLI (command line interface). The CLI can be used to easily concatenate files, merge files together, and de-code the flag and NaN bad data. It is quite simple to go from a large folder full of files to a clean, munged data file in less than a few commands. Full documentation and use cases can be found on the QuantAQ CLI website.
This section details quality assurance (QA) protocols and tests performed at the sub-1-minute level on the device. Tests are performed at the sub-component level and are based on extensive research and knowledge of how our sensors perform across various environments. They are subject to change at any time and are released and documented with new firmware releases (see changes.quant-aq.com for more details and historical records). Details are provided below where possible, though some details are left vague to protect IP. Please contact QuantAQ via support if you have any remaining questions. QA procedures are broken down by sub-component below.
If a sub-component fails a QA test at the 5s level, it will be flagged and logged on the µSD card. If the QA test fails a the 1-minute level, the 1-minute data record will be flagged appropriately.
Each measurement is checked to ensure the relative humidity and temperature are within a realistic range for ambient measurements and within the specifications provided by the sensor manufacturer. In other words, the temperature at time t () and relative humidity at time t () are checked to ensure they are within a specified range.
As documented in QAN-001, the particulate matter sensor is comprised of two separate components - a nephelometer and an optical particle counter (OPC). Several QA tests are performed on both individual components and the two components in complement.
Laser Power
The laser power of the OPC is checked to ensure it is within an acceptable operating range. Values for the acceptable operating range are based on years of data across thousands of devices as well as laboratory tests.
Flow Rate
The flow rate of air through the OPC is checked to ensure it is within an acceptable operating range.
Errant Bin Counts
The individual bin counts for each of the 24 OPC bins are checked to ensure they are below the overflow value. Additionally, an analysis is performed to ensure neighboring bins are within an expected range based on the value of counts in a specified bin.
For example, if there are 100 counts/cm3 in OPC bin 2, we ensure bins 1 and 3 look appropriate based on expected particle size distributions.
Sensor Intercomparison
For sub-micron particles, the values from both the OPC and nephelometer are checked against one another to ensure they fall within an appropriate range based on expected scattering patterns.
There are no consumable or user-replaceable components to the MODULAIR-PM. If you believe a component is broken or not functioning correctly, please contact support via the in-app chat for the next steps.
As a new product, issues will likely arise with the hardware, firmware, software, or all three! We do our best to prevent issues from arising and will be timely in fixing any that do arise. If you experience an issue or have a suggestion related to the MODULAIR-PM hardware, please check the knowledge base. If you do not find the answer you're looking for in the knowledge base, you can open a ticket via the in-app chat.
July 2021
0.3.0
Updated the Core Board to remove the external watchdog
de-populated components that were previously unused
January 2021
0.2.0
Removed the LED screen to mitigate issues and confusion around it being used for real-time information
Updated the enclosure to a new version due to supply chain issues
Introduced a new sheet-metal chassis
For a full list of firmware changes, please visit our public changelog.
All cables used in the MODULAIR-PM are manufactured by Molex and available via most major distributors including DigiKey, Mouser, and Newark. The following table lists the part numbers and cable lengths for the cable connector; exact pinout diagrams can be found in the following subsections. Where applicable, "NC" means not connected.
CBL-1
8
Molex
530470810
304.8
CBL-2
4
Molex
530480410
304.8
CBL-3
8
Molex
530470810
304.8
CBL-4
CBL-1 connects the Core Board to the µSD Breakout Board.
1
VCC
PWR
Power in; 4.2VDC (5.5V Max)
2
EN
IN
LVO enable pin (active high)
3
CLK
BD
CBL-2 connects the Core Board to the Relative Humidity and Temperature board on the sampling manifold.
1
VCC
PWR
Power in; 3.3V
2
SDA
DATA
Serial data line (I2C)
3
SCL
DATA
CBL-3 connects the Core Board to Particle Sensor 1.
1
VCC
PWR
Power in; 5V
2
GND
GND
Ground
3
NC
CBL-4 connects the Core Board to Particle Sensor 2.
1
VCC
PWR
Power in; 5V
2
SS
IN
Chip select pin (SPI)
3
MOSI
DATA
The LED indicator on the front panel is used to communicate the status of the cellular and cloud communication status. The LED changes color and mode, each of which indicates a different state as outlined below. The rate at which the LED blinks comes in two flavors: blinking and breathing, where breathing implies a slow pulse where the color of the LED fades in and out.
Green
Blinking
Looking for internet
If your device is blinking green, it is trying to connect to the cellular network. There is no need to take any action.
Breathing
Cloud not connected
If your device is breathing green, it has a cellular connection but has not been able to connect to the cloud.
Cyan
Blinking
Connecting to the cloud
Product Name
MODULAIR-PM
SKU(s)
MOD-PM-NorAm
Pre-2025 version of the MODULAIR-PM for use in North America.
MOD-PM-Global
Pre-2025 version of the MODULAIR-PM for use outside of North America.
As all QuantAQ products are internet-connected, it is important to consider connectivity when choosing an installation location. There are three primary things to consider:
Antenna Connection. If your device has an external antenna, ensure it is seated securely and placed at a 90º angle pointing toward the sky.
Antenna Placement. Do not place the device near metal objects or other sources of RF (i.e., antenna). Keep the antenna at least 18" away from metal objects as they can cause distortions and reflections.
Location and Cellular Availability. Install your sensor in a location with a known cellular signal on the carriers we support.

The Status LED on the front panel is used to communicate the status of the internet connection. The LED changes color and pattern, each of which indicates a different state as outlined below. The rate at which the LED blinks comes in two flavors: blinking and breathing, where breathing implies a slow pulse where the color of the LED fades in and out.
Green
Blinking
Looking for Internet
If your device is blinking green, it is trying to connect to the cellular network. There is no need to take any action.
Breathing
Cloud not Connected
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-PM-00001/data/?page=1&per_page=50&limit=3",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-PM-00001/data/?page=1&per_page=50&limit=3",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 3
}"data": [
{
"geo": {
"lat": 33.7769,
"lon": -84.4018
},
"met": {
"pressure": 990.2,
"rh": 10.54,
"temp": 22.1
},
"model": {
"pm": {
"pm1": 8802,
"pm10": 8804,
"pm25": 8803
}
},
"pm1": 1.293,
"pm10": 1.297,
"pm25": 1.297,
"sn": "MOD-PM-00001",
"timestamp": "2022-12-26T15:43:58",
"timestamp_local": "2022-12-26T10:43:58",
"url": "https://api.quant-aq.com/device-api/v1/devices/MOD-PM-00001/data/235414585"
},
{...},
{...},
]"data": [
{
"flag": 0,
"geo": {
"lat": 33.7769,
"lon": -84.4018
},
"met": {
"pressure": 989.9,
"rh": 10.32,
"temp": 22.16
},
"neph": {
"bin0": 210.25,
"bin1": 63.083,
"bin2": 3.75,
"bin3": 0.417,
"bin4": 0,
"bin5": 0,
"pm1": 0.333,
"pm10": 0.5,
"pm25": 0.5
},
"opc": {
"bin0": 1.1973,
"bin1": 0.0933,
"bin10": 0,
"bin11": 0,
"bin12": 0,
"bin13": 0,
"bin14": 0,
"bin15": 0,
"bin16": 0,
"bin17": 0,
"bin18": 0,
"bin19": 0,
"bin2": 0.0242,
"bin20": 0,
"bin21": 0,
"bin22": 0,
"bin23": 0,
"bin3": 0.007,
"bin4": 0,
"bin5": 0,
"bin6": 0,
"bin7": 0,
"bin8": 0,
"bin9": 0,
"pm1": 0.18,
"pm10": 0.21,
"pm25": 0.21,
"rh": 5.6,
"temp": 28.9
},
"sn": "MOD-PM-00001",
"timestamp": "2022-12-26T17:15:58",
"timestamp_local": "2022-12-26T12:15:58",
"url": "https://api.quant-aq.com/device-api/v1/devices/MOD-PM-00001/data/raw/235448331"
},
{...},
{...},
],# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0
# bit AND - is FLAG_NEPH set?
>>> 4 & 4
4MODULAIR™ provides real-time estimates of particulate matter concentrations (PM1, PM2.5, PM10), the particle size distribution, and four gas-phase measurements. MODULAIR utilizes the same, patent-pending particle measurement technology found in the MODULAIR-PM, which combines nephelometry with single-particle scattering to accurately measure aerosol loadings across a variety of environments.
PM1, PM2.5, PM10
0 to 2,000 µg/m3
Please see the spec sheet.
Particle size distribution
0.35 to 40.0 µm (24 bins)
Not yet determined
Ozone (O3)
0 to 500 ppb
5 ppb or 20%
Carbon Monoxide (CO)
0 to 13,000 ppb
40 ppb or 20%
*Temperature and relative humidity are measured inside the flow cell and should not be interpreted as true ambient measurements.
For more information on the operating principle and performance of the MODULAIR, please refer to QAN-001, QAN-003, and QAN-004.
🔋 Power
5V, 2A (supply) 250 mA average consumption
🗼 Communication
LTE CAT-M1 (North America) LTE CAT-M1/3G/2G (Global)
📈 Data
Web interface (quant-aq.com) Programmatic access (QuantAQ API) Local storage (µSD Card)
Weatherproof rating
IP68
Operating temperature
-20º to 45ºC
Operating humidity
5 to 95%, non-condensing
Dimensions
11.04" x 9.04" x 5.72"
Weight
6 lbs (2.72 kg)
The MODULAIR™ air quality sensor complies with part 15 of the FCC rules for class A devices. Operation is subject to the following two conditions: (1) this device may not cause harmful interference; (2) this device must accept any interference received, including interference that may cause undesired operation.
Model: MODULAIR
Contains FCC ID: 2AEMI-B404X
The MODULAIR™ complies with European Union EMC Directive 2014/30/EU and conforms to the following technical standards (EN 55011, EN 61326).
Model: MODULAIR
Contains FCC ID: 2AEMI-B524
When you unpack your MODULAIR, you should have received the following:
MODULAIR Air Quality Sensor
Power supply and USB-C charging cable
Mounting hardware (flanges with 4, 10-32 screws)
16 GB µSD card (pre-installed)
Device registration card
Sonic anemometer (if purchased)
Solar Power System (if purchased)
If any of these components are missing, please contact QuantAQ support via the in-app chat.
Upon opening your MODULAIR, it should appear as Figure 2.1 shows below, without the antenna attached. When attached, the antenna should be facing up to get the best service.
The front panel of the MODULAIR can be accessed by opening the lid of the enclosure. The panel provides access to the ON/OFF switch, the µSD card for local data logging, the internal battery status indicator (Battery Charge Status), and the device status LED (Device Status Indicator), all of which are shown in Figure 2.2.
Front Panel Screw
The front panel can be opened by unscrewing the Front Panel Screw, though should not be necessary under normal use. If it is opened, make sure that when re-closing, you do not "pop" out the µSD card. If so, you can simply push it back into place.
Viewing the bottom of the MODULAIR, you can see the air intake covered by an insect-screen, the RJ11 jack for connecting the optional sonic anemometer, and the USB-C power in.
The device circuit board is located under the front panel (Figure 2.2). To access, un-screw the Front Panel Screw and you will see the Core Board toward the lower left, as shown in Figure 2.4. The micro-USB cable is used exclusively for streaming logs directly from the device. While it does output some data, it is not designed to be used to connect to a data logger (this behavior is not supported). When used to collect logs, the MODULAIR must still be powered by the normal Power In USB-C connector shown in Figure 2.3.
The MODULAIR is shipped completely assembled, aside from the mounting hardware. Once the device is mounted and you have verified the power switch is in the OFF position, plug in the power supply and connect the USB-C cable to the bottom of the device. Once the power cable is connected, flip the power switch to the ON position. Upon receiving power, the Device Status LED (Figure 2.2) will flash green and eventually begin a sequence of slowly breathing cyan; this indicates the cellular connection is active and a session with the cloud server has begun.
The device will log data locally during the period where it is searching for cellular service and push the data to the server once a connection is established. If the LED indicator does not eventually begin breathing cyan, this indicates a cloud connectivity problem. Common errors and next steps can be found in Section 6.2.
To register your device, scan the QR code on the device registration card you received with your device. It is easiest to complete this step using a cellphone or tablet with a working internet connection. A laptop with a functioning camera will also work, though may be more difficult. It is also suggested that you first log in to the website (quant-aq.com) on the device you will use to complete this process. To register your device:
Use your camera to scan the QR code. This will open a tab in your default browser and will direct you to the device registration page.
Enter the fields for the information that the form asks for and click "Continue"
Enter the claim code found on the same QR code card → it should be a 6-character alphanumeric code.
Follow the instructions on the form and enter in data for the device location and other meta data. All of these can be changed in the future through the dashboard, so don't worry if you can't answer all questions at this time.
The MODULAIR can be mounted in several ways, depending on your exact use and the available mounting options available to you. The device is shipped with mounting flanges, which can be used to easily mount the device to several surfaces. Each flange is secured to the back of the device with two 10-32 stainless steel screws (included). Each flange includes three slots with the following dimensions:
Common installation approaches include:
using high-strength zip ties to secure the device to a fence or post (not recommended)
using screws to mount the device to a wall using the provided flanges
Using u-bolts or similar to attach to a fence post, fence, or rail
Purchase a pole mount kit from Polycase (the box supplier). Polycase part number PK-087.
The complete box dimensions are:
11.04" x 9.04" x 5.72" (280.42 x 229.62 x 145.29 mm)
There are three primary ways in which data can be accessed for the MODULAIR:
Raw data is stored locally on the µSD card
Data can be downloaded from the QuantAQ Cloud Console
Data can be downloaded from the QuantAQ API
The data formats are slightly different depending on which method you’ve used to access the data, each of which is documented below.
Data is collected and saved to an onboard µSD card every five seconds; each minute, these values are averaged and pushed to the cloud where they are available on the QuantAQ Cloud. It is unlikely you will ever need to use the locally saved data; however, you are more than welcome to use it if you would like. This section covers the locally stored data and how to understand it. When removing the µSD card to pull the data, make sure your device is turned OFF.
On the µSD card, you will find data files (with a prefix of DATA_YYYYMMDD.csv) and log files which are located in the logs directory. Log files contain debugging information about the onboard sensors and the cellular communication module. It is unlikely these logs will be useful to most users, though they are available to you if you would like to use them. It is highly recommended that you use the QuantAQ CLI (discussed below) to analyze them, as it will vastly reduce the amount of time needed.
Data files are written each day and can be read or analyzed using any programming language or spreadsheet program (e.g., Microsoft Excel). Each file begins with three meta-data rows describing the device model (row 1), device ID (row 2), and device serial number (row 3). See Figure 3.1A below. If you are automating your data analysis, you can skip these three rows. The fourth row contains the header information with the names of all columns. The remaining rows contain the data, where each row corresponds to a new 5-second sampling interval. The table below summarizes the columns.
The data outputs will change depending on the SKU (or model) of your MODULAIR. Most columns are constant except for the gas-phase columns.
timestamp_iso
all
The sample timestamp in ISO format
sku
all
The device SKU number
fw
all
Data are pushed to the QuantAQ Cloud with 1-minute time resolution and can be downloaded via the QuantAQ Cloud Console. When downloading data, you can select whether you would like to download the raw data, the final data, or both the raw+final data. Generally, the final data is what is desired, as it contains the final, cleaned data that is ready for analysis. The raw data is well-suited for researchers trying to investigate specific questions. When downloaded, the data is exported as a csv and contains the following columns:
timestamp
The sample timestamp in ISO format
id
A unique id the corresponds to the record shown
timestamp_local
Data are available via the QuantAQ API at a 1-minute recording interval → the data available are the same as those available via the QuantAQ Cloud Console discussed above. The API is designed to allow engineers to build applications and map layers powered by the QuantAQ platform; however, it can also be a good way to automate data downloads, especially for large teams or lengthy download intervals. The data format is slightly different, as outlined below.
Each API call will return a paginated list of json objects with two keys: data and metaand will look something like the following:
The key definitions can be described as:
first_url: The unique url for the first page of data in the query
last_url: The unique url for the last page of data in the query
next_url: The unique url for the next page of data in the query
prev_url: The unique url for the previous page of data in the query
page: The current page number
pages: The total number of pages available for the query
per_page: The number of data objects per page
total: The total number of data objects in the query
The data object contains a list of all individual data objects for that page of data. You can query either the raw or the final data, both of which have different data values available. The final endpoint will return the following and will be different depending on the product SKU:
It contains several objects including the geo, met, and model objects. The descriptions of the individual data points are mapped to their respective columns in Section 3.1.2 above.
Note: If nothing appears in the right-hand column, the variable definition/name is the same
geo.lat
lat
geo.lon
lon
met.wd
wd
met.ws
ws
met.rh
rh
met.temp
temp
model.pm.pm1
pm1_model_id
Each row of data contains a single-byte data flag that describes the current state of the device. Flags are stored as unsigned integers and contain encoded information about each of the sensors on board. They are generated via a bitmask and can be decoded by reversing the procedure. To determine whether a specific flag is set, you can use the bitwise AND operation. If the flag's value is returned, then it is set. If a zero is returned, it is not set. This can seem complicated, so let's clear it up with a simple example.
Let's assume the value of the flag column is set to 4. We can perform a bitwise AND operation to check the result to see if FLAG_STARTUP was set (it wasn't). Below, we will check to see if the flag for the nephelometer is set (it is!).
The following table describes the flags, their value, and what they mean.
The following table describes the flags, their value, and what they mean.
FLAG_STARTUP
1
This flag is set when the device powers on.
Remove any rows where this flag is set.
FLAG_OPC
2
This flag is set when the OPC has indicated the data failed to transfer correctly. This can be caused by the fan being off, the laser being off, or the checksum not validating properly.
Remove any rows where this flag is set.
FLAG_NEPH
4
This flag is set when the nephelometer has indicated the data failed to transfer correctly.
To make data analysis easier, QuantAQ maintains several software programs designed to reduce the time you spend munging and cleaning your data. The most relevant piece of software is going to be the QuantAQ CLI (command line interface). The CLI can be used to easily concatenate files, merge files together, and de-code the flag and NaN bad data. It is quite simple to go from a large folder full of files to a clean, munged data file in less than a few commands. Full documentation and use cases can be found on the QuantAQ CLI website.
There are no consumable or user-replaceable components to the MODULAIR-PM. If you believe a component is broken or not functioning correctly, please contact support via the in-app chat.
As a new product, issues will likely arise with the hardware, firmware, software, or all three! We do our best to prevent issues from arising and will be timely in fixing any that do arise. If you experience an issue or have a suggestion related to the MODULAIR hardware, please check the knowledge base. If you do not find the answer you're looking for in the knowledge base, you can open a ticket via the in-app chat.
October 2021
0.1.0
First production release. No changes at this time.
Please see our public changelog for a full history of all firmware support changes.
Coming soon!
Product Name
MODULAIR
SKU(s)
MOD-XXX-NorAm
Pre-2025 version of the MODULAIR for use in North America.
MOD-XXX-Global
Pre-2025 version of the MODULAIR for use outside of North America.
Datasheet
As all QuantAQ products are internet-connected, it is important to consider connectivity when choosing an installation location. There are three primary things to consider:
Antenna Connection. If your device has an external antenna, ensure it is seated securely and placed at a 90º angle pointing toward the sky.
Antenna Placement. Do not place the device near metal objects or other sources of RF (i.e., antenna). Keep the antenna at least 18" away from metal objects as they can cause distortions and reflections.
Location and Cellular Availability. Install your sensor in a location with a known cellular signal on the carriers we support.
bin1
p/cm3
Number of particles per cubic cm in bin1 (0.46 - 0.66 µm)
bin2
p/cm3
Number of particles per cubic cm in bin2 (0.66 - 1.0 µm)
bin3
p/cm3
Number of particles per cubic cm in bin3 (1.0 - 1.3 µm)
bin4
p/cm3
Number of particles per cubic cm in bin4 (1.3 - 1.7 µm)
bin5
p/cm3
Number of particles per cubic cm in bin5 (1.7 - 2.3 µm)
bin6
p/cm3
Number of particles per cubic cm in bin6 (2.3 - 3.0 µm)
bin7
p/cm3
Number of particles per cubic cm in bin7 (3.0 - 4.0 µm)
bin8
p/cm3
Number of particles per cubic cm in bin8 (4.0 - 5.2 µm)
bin9
p/cm3
Number of particles per cubic cm in bin9 (5.2 - 6.5 µm)
bin10
p/cm3
Number of particles per cubic cm in bin10 (6.5 - 8.0 µm)
bin11
p/cm3
Number of particles per cubic cm in bin11 (8.0 - 10.0 µm)
bin12
p/cm3
Number of particles per cubic cm in bin12 (10.0 - 12.0 µm)
bin13
p/cm3
Number of particles per cubic cm in bin13 (12.0 - 14.0 µm)
bin14
p/cm3
Number of particles per cubic cm in bin14 (14.0 - 16.0 µm)
bin15
p/cm3
Number of particles per cubic cm in bin15 (16.0 - 18.0 µm)
bin16
p/cm3
Number of particles per cubic cm in bin16 (18.0 - 20.0 µm)
bin17
p/cm3
Number of particles per cubic cm in bin17 (20.0 - 22.0 µm)
bin18
p/cm3
Number of particles per cubic cm in bin18 (22.0 - 25.0 µm)
bin19
p/cm3
Number of particles per cubic cm in bin19 (25.0 - 28.0 µm)
bin20
p/cm3
Number of particles per cubic cm in bin20 (28.0 - 31.0 µm)
bin21
p/cm3
Number of particles per cubic cm in bin21 (31.0 - 34.0 µm)
bin22
p/cm3
Number of particles per cubic cm in bin22 (34.0 - 37.0 µm)
bin23
p/cm3
Number of particles per cubic cm in bin23 (37.0 - 40.0 µm)
bin1MToF
ml/s
Time of flight for particles in bin1
bin3MToF
ml/s
Time of flight for particles in bin3
bin5MToF
ml/s
Time of flight for particles in bin5
bin7MToF
ml/s
Time of flight for particles in bin7
sample_period
s
The sample period
sample_flow
ml/s
The sample flow rate
opc_temp
ºC
The internal temperature of the OPC
opc_rh
%
The internal relative humidity of the OPC
opc_pm1
µg/m3
The factory computed value for PM1 from the OPC
opc_pm25
µg/m3
The factory computed value for PM2.5 from the OPC
opc_pm10
µg/m3
The factory computed value for PM10 from the OPC
laser_status
The status of the laser
pm1_std
µg/m3
The factory computed value for PM1 from the nephelometer
pm25_std
µg/m3
The factory computed value for PM2.5 from the nephelometer
pm10_std
µg/m3
The factory computed value for PM10 from the nephelometer
pm1_env
µg/m3
The factory computed value for PM1 from the nephelometer
pm25_env
µg/m3
The factory computed value for PM2.5 from the nephelometer
pm10_env
µg/m3
The factory computed value for PM10 from the nephelometer
neph_bin0
p
Number of particles in bin0 for the nephelometer
neph_bin1
p
Number of particles in bin1 for the nephelometer
neph_bin2
p
Number of particles in bin2 for the nephelometer
neph_bin3
p
Number of particles in bin3 for the nephelometer
neph_bin4
p
Number of particles in bin4 for the nephelometer
neph_bin5
p
Number of particles in bin5 for the nephelometer
flag
The status flag corresponding to this sample
fw
The current firmware version
connection_status
A boolean describing the state of the cellular connection
sample_rh
%
The sample relative humidity
sample_temp
°C
The sample temperature
sample_pres
mmHg
The sample pressure (available only on select devices)
bin0
p/cm3
Number of particles per cubic cm in bin0 (0.35 - 0.46 µm)
bin1
p/cm3
Number of particles per cubic cm in bin1 (0.46 - 0.66 µm)
bin2
p/cm3
Number of particles per cubic cm in bin2 (0.66 - 1.0 µm)
bin3
p/cm3
Number of particles per cubic cm in bin3 (1.0 - 1.3 µm)
bin4
p/cm3
Number of particles per cubic cm in bin4 (1.3 - 1.7 µm)
bin5
p/cm3
Number of particles per cubic cm in bin5 (1.7 - 2.3 µm)
bin6
p/cm3
Number of particles per cubic cm in bin6 (2.3 - 3.0 µm)
bin7
p/cm3
Number of particles per cubic cm in bin7 (3.0 - 4.0 µm)
bin8
p/cm3
Number of particles per cubic cm in bin8 (4.0 - 5.2 µm)
bin9
p/cm3
Number of particles per cubic cm in bin9 (5.2 - 6.5 µm)
bin10
p/cm3
Number of particles per cubic cm in bin10 (6.5 - 8.0 µm)
bin11
p/cm3
Number of particles per cubic cm in bin11 (8.0 - 10.0 µm)
bin12
p/cm3
Number of particles per cubic cm in bin12 (10.0 - 12.0 µm)
bin13
p/cm3
Number of particles per cubic cm in bin13 (12.0 - 14.0 µm)
bin14
p/cm3
Number of particles per cubic cm in bin14 (14.0 - 16.0 µm)
bin15
p/cm3
Number of particles per cubic cm in bin15 (16.0 - 18.0 µm)
bin16
p/cm3
Number of particles per cubic cm in bin16 (18.0 - 20.0 µm)
bin17
p/cm3
Number of particles per cubic cm in bin17 (20.0 - 22.0 µm)
bin18
p/cm3
Number of particles per cubic cm in bin18 (22.0 - 25.0 µm)
bin19
p/cm3
Number of particles per cubic cm in bin19 (25.0 - 28.0 µm)
bin20
p/cm3
Number of particles per cubic cm in bin20 (28.0 - 31.0 µm)
bin21
p/cm3
Number of particles per cubic cm in bin21 (31.0 - 34.0 µm)
bin22
p/cm3
Number of particles per cubic cm in bin22 (34.0 - 37.0 µm)
bin23
p/cm3
Number of particles per cubic cm in bin23 (37.0 - 40.0 µm)
opcn3_temp
C
The temperature of the onboard circuit board
opcn3_rh
%
The RH of the onboard circuit board
opcn3_pm1
µg/m3
Factory computed value of PM1 from the OPC
opcn3_pm25
µg/m3
Factory computed value of PM2.5 from the OPC
opcn3_pm10
µg/m3
Factory computed value of PM10 from the OPC
pm1_env
µg/m3
Factory computed value of PM1 from the nephelometer
pm25_env
µg/m3
Factory computed value of PM2.5 from the nephelometer
pm10_env
µg/m3
Factory computed value of PM10 from the nephelometer
neph_bin0
counts
The number of particles in bin0 from the nephelometer
neph_bin1
counts
The number of particles in bin1 from the nephelometer
neph_bin2
counts
The number of particles in bin2 from the nephelometer
neph_bin3
counts
The number of particles in bin3 from the nephelometer
neph_bin4
counts
The number of particles in bin4 from the nephelometer
neph_bin5
counts
The number of particles in bin5 from the nephelometer
flag
The status flag corresponding to this record
lat
deg
The latitude of the device
lon
deg
The longitude of the device
device_state
The current state of the device
pm1
µg/m3
The PM1 value
pm25
µg/m3
The PM2.5 value
pm10
µg/m3
The PM10 value
pm1_model_id
The id corresponding to the model used to compute PM1
pm25_model_id
The id corresponding to the model used to compute PM2.5
pm10_model_id
The id corresponding to the model used to compute PM10
model.pm.pm10
pm10_model_id
pm1
pm25
pm10
sn
timestamp
timestamp_local
url
The unique url for this data point.
neph.pm1
pm1_env
neph.pm25
pm25_env
neph.pm10
pm10_env
opc.bin0 through opc.bin23
bin0 through bin23
opc.pm1
opcn3_pm1
opc.pm25
opcn3_pm25
opc.pm10
opcn3_pm10
opc.temp
opcn3_temp
opc.rh
opcn3_rh
sn
timestamp
timestamp_local
url
The unique url for this data point.
FLAG_OVERHEAT
4096
This flag is set when the OPC has overheated.
Contact QuantAQ.
FLAG_SD
8192
This flag is set when the SD card has failed.
Replace the SD card
6
Molex
5015680607
304.8
Serial Clock (SPI)
4
MOSI
BD
Master out slave in (MOSI)
5
CS
IN
Chip Select (SPI)
6
MISO
BD
Master in slave out (SPI)
7
NC
8
GND
GND
Ground
Serial clock line (I2C)
8
GND
GND
Ground
4
NC
5
TXD
DATA
Serial data (UART)
6
NC
7
NC
8
NC
Master out slave in (SPI)
4
MISO
DATA
Master in slave out (SPI)
5
CLK
DATA
Serial clock (SPI)
6
GND
GND
Ground
Blinking cyan indicates the device has a cellular connection and is attempting to connect to the cloud. There is no need to take any action. This will happen each time on device startup.
Breathing
Connected
When your device is breathing cyan, everything is good and you are happily connected to the internet and the QuantAQ Cloud.
Magenta
Blinking
Firmware Update
When your device is blinking magenta, it is undergoing an over-the-air firmware update. DO NOT power off when this is happening.
White
Breathing
Cellular Off
If the LED is breathing white, the cellular connection has been turned off. If you did not explicitly turn off the cellular connection via the on-board switch, please notify QuantAQ.
Red
Blinking
System Failure
A system failure has occurred. This is likely caused by faulty on-board firmware or corrupted memory. Please contact QuantAQ for next steps.





If your device is breathing green, it has a cellular connection but has not been able to connect to the cloud.
Cyan
Blinking
Connecting to the Cloud
Blinking cyan indicates the device has a cellular connection and is attempting to connect to the cloud. There is no need to take any action. This will happen each time on device startup.
Breathing
Connected
When your device is breathing cyan, everything is good and you are happily connected to the internet and the QuantAQ Cloud.
Magenta
Blinking
Firmware Update
When your device is blinking magenta, it is undergoing an over-the-air firmware update. DO NOT power off when this is happening.
White
Breathing
Internet Off
If the LED is breathing white, the cellular connection has been turned off. If you did not explicitly turn off the cellular connection via the onboard switch, please notify QuantAQ.
Red
Blinking
System Failure
A system failure has occurred. This is likely caused by faulty on-board firmware or corrupted memory. Please contact QuantAQ for next steps.
Each record contains a status flag, stored as an unsigned integer, that describes the state of the device for that exact record. Flags contain encoded information about each of the sub-components onboard the device. They are generated via a bitmask and can be decoded by reversing the procedure. To determine whether a specific flag is set, you can use the bitwise AND operator. If the value of the flag is returned, then the flag is set. If a zero is returned, the flag is not set.
To make this a bit clearer, let's follow this example. Let's assume the value of the flag is set to "4". We can perform a bitwise AND operation to check the result to see if FLAG_STARTUP is set.
The table below describes the available flags, flag values, and a description of what they mean and what action should be taken when they are set.
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-00001/data/?page=1&per_page=50&limit=3",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-00001/data/?page=1&per_page=50&limit=3",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 3
}"data": [
{
"co": 132.63,
"geo": {
"lat": 19.451,
"lon": -155.879
},
"met": {
"rh": 69.6,
"temp": 20,
"wd": 15.1,
"ws": 5.25
},
"model": {
"gas": {},
"pm": {
"pm1": 4692,
"pm10": 4694,
"pm25": 4693
}
},
"pm1": 0.53,
"pm10": 24.59,
"pm25": 3.64,
"rh": 69.6,
"sn": "MOD-00001",
"so2": 6.35,
"temp": 20,
"timestamp": "2022-12-20T17:54:57",
"timestamp_local": "2022-12-20T07:54:57",
"url": "https://api.quant-aq.com/device-api/v1/devices/MOD-00001/data/23523900",
"wd": 15.1,
"ws": 5.25
},
{...},
{...},
]# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0
# bit AND - is FLAG_NEPH set?
>>> 4 & 4
4MODULAIR
PM + Gas Sensor
MODULAIR-PM
PM Sensor
MODULAIR-UFP
Ultrafine Particle Monitor
Solar Power System
Make your life easier with our easy-to-use tooling.
QuantAQ Cloud API
Learn the basics of the QuantAQ Cloud API.
Developer Tools & Resources
Make your life easier with our easy-to-use tooling.
FLAG_STARTUP
1
This flag is set when the device powers on.
Remove any rows where this flag is set.
FLAG_OPC
2
This flag is set when the OPC has indicated the data failed to transfer correctly. This can be caused by the fan being off, the laser being off, or the checksum not validating properly.
Remove any rows where this flag is set.
FLAG_NEPH
4
This flag is set when the nephelometer has indicated the data failed to transfer correctly.
Remove any rows where this flag is set.
FLAG_RHTP
8
This flag is set when the relative humidity and temperature sensor has failed.
Remove any rows where this flag is set.
FLAG_CO
Nitrogen Oxide (NO)
0 to 5,000 ppb
5 ppb or 20%
Nitrogen Dioxide (NO2)
0 to 5,000 ppb
6 ppb or 35%
Temperature*
-40º to 85º C
+/- 0.2ºC
Relative Humidity*
0 to 100%
+/- 2%
The current firmware version
flag
all
The status flag corresponding to this data row
sample_temp
all
°C
The sample temperature
sample_rh
all
%
The sample relative humidity
bin0
all
p/cm3
Number of particles per cubic cm in bin0 (0.35 - 0.46 µm)
bin1
all
p/cm3
Number of particles per cubic cm in bin1 (0.46 - 0.66 µm)
bin2
all
p/cm3
Number of particles per cubic cm in bin2 (0.66 - 1.0 µm)
bin3
all
p/cm3
Number of particles per cubic cm in bin3 (1.0 - 1.3 µm)
bin4
all
p/cm3
Number of particles per cubic cm in bin4 (1.3 - 1.7 µm)
bin5
all
p/cm3
Number of particles per cubic cm in bin5 (1.7 - 2.3 µm)
bin6
all
p/cm3
Number of particles per cubic cm in bin6 (2.3 - 3.0 µm)
bin7
all
p/cm3
Number of particles per cubic cm in bin7 (3.0 - 4.0 µm)
bin8
all
p/cm3
Number of particles per cubic cm in bin8 (4.0 - 5.2 µm)
bin9
all
p/cm3
Number of particles per cubic cm in bin9 (5.2 - 6.5 µm)
bin10
all
p/cm3
Number of particles per cubic cm in bin10 (6.5 - 8.0 µm)
bin11
all
p/cm3
Number of particles per cubic cm in bin11 (8.0 - 10.0 µm)
bin12
all
p/cm3
Number of particles per cubic cm in bin12 (10.0 - 12.0 µm)
bin13
all
p/cm3
Number of particles per cubic cm in bin13 (12.0 - 14.0 µm)
bin14
all
p/cm3
Number of particles per cubic cm in bin14 (14.0 - 16.0 µm)
bin15
all
p/cm3
Number of particles per cubic cm in bin15 (16.0 - 18.0 µm)
bin16
all
p/cm3
Number of particles per cubic cm in bin16 (18.0 - 20.0 µm)
bin17
all
p/cm3
Number of particles per cubic cm in bin17 (20.0 - 22.0 µm)
bin18
all
p/cm3
Number of particles per cubic cm in bin18 (22.0 - 25.0 µm)
bin19
all
p/cm3
Number of particles per cubic cm in bin19 (25.0 - 28.0 µm)
bin20
all
p/cm3
Number of particles per cubic cm in bin20 (28.0 - 31.0 µm)
bin21
all
p/cm3
Number of particles per cubic cm in bin21 (31.0 - 34.0 µm)
bin22
all
p/cm3
Number of particles per cubic cm in bin22 (34.0 - 37.0 µm)
bin23
all
p/cm3
Number of particles per cubic cm in bin23 (37.0 - 40.0 µm)
bin1MToF
all
ml/s
Time of flight for particles in bin1
bin3MToF
all
ml/s
Time of flight for particles in bin3
bin5MToF
all
ml/s
Time of flight for particles in bin5
bin7MToF
all
ml/s
Time of flight for particles in bin7
sample_period
all
s
The sample period in seconds.
sample_flow
all
ml/s
The OPC sample flow rate.
opc_temp
all
°C
The internal temperature of the OPC
opc_rh
all
%
The internal relative humidity of the OPC
opc_pm1
all
µg/m3
The factory computed value for PM1 from the OPC
opc_pm25
all
µg/m3
The factory computed value for PM2.5 from the OPC
opc_pm10
all
µg/m3
The factory computed value for PM10 from the OPC
laser_status
all
The status of the OPC laser.
pm1_std
all
µg/m3
The factory computed value for PM1 from the Nephelometer
pm25_std
all
µg/m3
The factory computed value for PM2.5 from the Nephelometer
pm10_std
all
µg/m3
The factory computed value for PM10 from the Nephelometer
pm1_env
all
µg/m3
The factory computed value for PM1 from the Nephelometer
pm25_env
all
µg/m3
The factory computed value for PM2.5 from the Nephelometer
pm10_env
all
µg/m3
The factory computed value for PM10 from the Nephelometer
neph_bin0
all
p
Number of particles in bin0 for the nephelometer
neph_bin1
all
p
Number of particles in bin1 for the nephelometer
neph_bin2
all
p
Number of particles in bin2 for the nephelometer
neph_bin3
all
p
Number of particles in bin3 for the nephelometer
neph_bin4
all
p
Number of particles in bin4 for the nephelometer
neph_bin5
all
p
Number of particles in bin5 for the nephelometer
ws
all
mph
The wind speed from the sonic anemometer.
wd
all
deg
The wind direction from the sonic anemometer.
co_we
015, 031, 033
mV
The working electrode signal for the CO sensor.
co_ae
015, 031, 033
mV
The auxiliary electrode signal for the CO sensor.
no_we
015, 031
mV
The working electrode signal for the NO sensor.
no_ae
015, 031
mV
The auxiliary electrode signal for the NO sensor.
so2_we
033
mV
The working electrode signal for the SO2 sensor.
so2_ae
033
mV
The auxiliary electrode signal for the SO2 sensor.
no2_we
015, 031
mV
The working electrode signal for the NO2 sensor.
no2_ae
015, 031
mV
The auxiliary electrode signal for the NO2 sensor.
ox_we
015, 031
mV
The working electrode signal for the OX sensor.
ox_ae
015, 031
mV
The auxiliary electrode signal for the OX sensor.
co2_raw
031
mV
The raw signal for the CO2 sensor.
The sample timestamp in ISO format, corrected for the timezone as defined in the device settings
sn
The device serial number
rh
%
The sample relative humidity
temp
°C
The sample temperature
bin0
p/cm3
Number of particles per cubic cm in bin0 (0.35 - 0.46 µm)
bin1
p/cm3
Number of particles per cubic cm in bin1 (0.46 - 0.66 µm)
bin2
p/cm3
Number of particles per cubic cm in bin2 (0.66 - 1.0 µm)
bin3
p/cm3
Number of particles per cubic cm in bin3 (1.0 - 1.3 µm)
bin4
p/cm3
Number of particles per cubic cm in bin4 (1.3 - 1.7 µm)
bin5
p/cm3
Number of particles per cubic cm in bin5 (1.7 - 2.3 µm)
bin6
p/cm3
Number of particles per cubic cm in bin6 (2.3 - 3.0 µm)
bin7
p/cm3
Number of particles per cubic cm in bin7 (3.0 - 4.0 µm)
bin8
p/cm3
Number of particles per cubic cm in bin8 (4.0 - 5.2 µm)
bin9
p/cm3
Number of particles per cubic cm in bin9 (5.2 - 6.5 µm)
bin10
p/cm3
Number of particles per cubic cm in bin10 (6.5 - 8.0 µm)
bin11
p/cm3
Number of particles per cubic cm in bin11 (8.0 - 10.0 µm)
bin12
p/cm3
Number of particles per cubic cm in bin12 (10.0 - 12.0 µm)
bin13
p/cm3
Number of particles per cubic cm in bin13 (12.0 - 14.0 µm)
bin14
p/cm3
Number of particles per cubic cm in bin14 (14.0 - 16.0 µm)
bin15
p/cm3
Number of particles per cubic cm in bin15 (16.0 - 18.0 µm)
bin16
p/cm3
Number of particles per cubic cm in bin16 (18.0 - 20.0 µm)
bin17
p/cm3
Number of particles per cubic cm in bin17 (20.0 - 22.0 µm)
bin18
p/cm3
Number of particles per cubic cm in bin18 (22.0 - 25.0 µm)
bin19
p/cm3
Number of particles per cubic cm in bin19 (25.0 - 28.0 µm)
bin20
p/cm3
Number of particles per cubic cm in bin20 (28.0 - 31.0 µm)
bin21
p/cm3
Number of particles per cubic cm in bin21 (31.0 - 34.0 µm)
bin22
p/cm3
Number of particles per cubic cm in bin22 (34.0 - 37.0 µm)
bin23
p/cm3
Number of particles per cubic cm in bin23 (37.0 - 40.0 µm)
opcn3_pm1
µg/m3
Factory computed value of PM1 from the OPC
opcn3_pm25
µg/m3
Factory computed value of PM2.5 from the OPC
opcn3_pm10
µg/m3
Factory computed value of PM10 from the OPC
pm1_env
µg/m3
Factory computed value of PM1 from the nephelometer
pm25_env
µg/m3
Factory computed value of PM2.5 from the nephelometer
pm10_env
µg/m3
Factory computed value of PM10 from the nephelometer
neph_bin0
p
The number of particles in bin0 from the nephelometer
wd
deg
Wind direction from the sonic anemometer
ws
mph
Wind speed from the sonic anemometer
co_we
mV
The working electrode signal for the CO sensor.
co_ae
mV
The auxiliary electrode signal for the CO sensor.
no_we
mV
The working electrode signal for the NO sensor.
no_ae
mV
The auxiliary electrode signal for the NO sensor.
no2_we
mV
The working electrode signal for the NO2 sensor.
no2_ae
mV
The auxiliary electrode signal for the NO2 sensor.
o3_we
mV
The working electrode signal for the O3 sensor.
o3_ae
mV
The auxiliary electrode signal for the O3 sensor.
co2_raw
mV
The raw CO2 signal
co_diff
mV
The difference between co_we and co_ae
no_diff
mV
The difference between no_we and no_ae
no2_diff
mV
The difference between no2_we and no2_ae
ox_diff
mV
The difference between o3_we and o3_ae
flag
The status flag corresponding to this record
lat
deg
The latitude of the device
lon
deg
The longitude of the device
device_state
The current state of the device
pm1
µg/m3
The PM1 value
pm25
µg/m3
The PM2.5 value
pm10
µg/m3
The PM10 value
co
ppb
The CO concentration
no
ppb
The NO concentration
no2
ppb
The NO2 concentration
o3
ppb
The O3 concentration
co2
ppm
The CO2 concentration
pm1_model_id
The id corresponding to the model used to compute PM1
pm25_model_id
The id corresponding to the model used to compute PM2.5
pm10_model_id
The id corresponding to the model used to compute PM10
co_model_id
The id corresponding to the model used to compute CO
no_model_id
The id corresponding to the model used to compute NO
no2_model_id
The id corresponding to the model used to compute NO2
o3_model_id
The id corresponding to the model used to compute O3
co2_model_id
The id corresponding to the model used to compute CO2
model.pm.pm25
pm25_model_id
model.pm.pm10
pm10_model_id
pm1
pm25
pm10
co, no, no2, o3, so2, co2
Pending SKU, you may have one or more of these columns
sn
timestamp
timestamp_local
url
The unique url for this data point.
Remove any rows where this flag is set.
FLAG_RHTP
8
This flag is set when the relative humidity and temperature sensor has failed.
Remove any rows where this flag is set.
FLAG_CO
16
This flag is set when the CO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO
32
This flag is set when the NO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO2
64
This flag is set when the NO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_O3
128
This flag is set when the O3 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_CO2
256
This flag is set when the CO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_SO2
512
This flag is set when the SO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_H2S
1024
This flag is set when the H2S sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_BAT
2048
This flag is set when the internal LiPo battery is low or dead.
None.
FLAG_OVERHEAT
4096
This flag is set when the OPC has overheated.
Contact QuantAQ.
FLAG_SD
8192
This flag is set when the SD card has failed.
Replace the SD card.








# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0
# bit AND - is FLAG_NEPH set?
>>> 4 & 4
416
This flag is set when the CO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO
32
This flag is set when the NO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO2
64
This flag is set when the NO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_O3
128
This flag is set when the O3 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_CO2
256
This flag is set when the CO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_SO2
512
This flag is set when the SO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_H2S
1024
This flag is set when the H2S sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_BAT
2048
This flag is set when the internal LiPo battery is low or dead.
None.
FLAG_OVERHEAT
4096
This flag is set when the OPC has overheated.
Contact QuantAQ.
FLAG_SD
8192
This flag is set when the SD card has failed.
Replace the SD card.
The LED indicator on the front panel is used to communicate the status of the cellular and cloud communication status. The LED changes color and mode, each of which indicates a different state as outlined below. The rate at which the LED blinks comes in two flavors: blinking and breathing, where breathing implies a slow pulse where the color of the LED fades in and out.
Green
Blinking
Looking for internet
If your device is blinking green, it is trying to connect to the cellular network. There is no need to take any action.
Breathing
Cloud not connected
If your device is breathing green, it has a cellular connection but has not been able to connect to the cloud.
Cyan
Blinking
Connecting to the cloud
Blinking cyan indicates the device has a cellular connection and is attempting to connect to the cloud. There is no need to take any action. This will happen each time on device startup.
Breathing
Connected
When your device is breathing cyan, everything is good and you are happily connected to the internet and the QuantAQ Cloud.
Magenta
Blinking
Firmware Update
When your device is blinking magenta, it is undergoing an over-the-air firmware update. DO NOT power off when this is happening.
White
Breathing
Cellular Off
If the LED is breathing white, the cellular connection has been turned off. If you did not explicitly turn off the cellular connection via the on-board switch, please notify QuantAQ.
Red
Blinking
System Failure
A system failure has occurred. This is likely caused by faulty on-board firmware or corrupted memory. Please contact QuantAQ for next steps.
Product manual for the MODULAIR-UFP ultrafine particle monitor.
Product Name
MODULAIR-UFP
SKU(s)
MOD-UFP-NORAM
For use in North America.
MOD-UFP-GLOBAL
For use outside North America. Please contact QuantAQ Sales for specific country support.
The MODULAIR™-UFP provides real-time, direct measurement of total particle number concentration (~5-3,000 nm), temperature, humidity, pressure, wind direction, and wind speed in an easy-to-use, easy-to-deploy, internet-connected system.
*This is the specification for the temperature measurement itself provided by the GMX500 weather station, not the safe operating temperature of the MODULAIR-UFP.
For more information on the operating principle of the CPC, please refer to .
Coming soon.
Below is a front view of the MODULAIR-UFP. Air is pulled in through the inlet on the base of the unit (see 2.2 Base View for a more detailed view). The top of the unit features the Gill MaxiMet GMX500 weather station.
The base of the MODULAIR-UFP highlights the inlet (with insect screen installed) and the M12 Power Cable.
The internals of the MODULAIR-UFP can be accessed by opening the outer lid of the MODULAIR-UFP enclosure. Near the top (closest to the weather station, external), you will see the power switch, status LED, µUSB debugging port, and µSD card. On the right-hand side, you will see the condensation particle counter (CPC). On the left-hand side, you will see the water reservoir and the load cell. Near the bottom, you will see the purge port.
The Core Board is mounted to the main chassis internal to the MODULAIR-UFP. A top-down view can be seen in Figure 2.3, where the µSD card, debugging port, Status LED, and power switch are accessible.
Your MODULAIR-UFP arrives in a custom Seahorse shipping case that is designed to keep your MODULAIR-UFP safe during transport. It is essential that you keep this case as-is in the event you need to transport the MODULAIR-UFP or ship it back to QuantAQ for calibration or repair. For shipping purposes, with all components in place, the enclosure measures 31" x 21" x 11" and weighs 45 lb.
When unpacking your MODULAIR-UFP, you should expect to find the following:
MODULAIR-UFP Ultrafine Particle Monitor
Pole Mount Bracket
Components Box
Device registration card
In the cardboard components box (lower right of Figure 3.1), you will find the loose components, including the power cable, power brick, registration card, and liquid syringe. These components are shown in Figure 3.2.
When removing the MODULAIR-UFP from its case, it is important not to lift by the Weather Station. This also applies when putting the MODULAIR-UFP back inside its case. Lift by either grabbing the sides of the polycarbonate enclosure or by the aluminum weather station mount, located between the polycarbonate enclosure and the weather station.
Once you remove the MODULAIR-UFP from its case, you will see a thin sheet of foam that sits below the sensor. After removing this layer of foam, you will find the Pole Mount Bracket. Please see Figure 3.3 for more instructions.
A video overview of how to best pack and unpack your MODULAIR-UFP can be found below.
The MODULAIR-UFP ships with a Pole Mount Kit specifically designed to support the unit. It is designed to be attached to a pole or Post with a diameter between 1.25" and 2". The MODULAIR-UFP should be mounted toward the top of a pole or post such that the weather station is not impeded by anything and can provide accurate data (see Figure 3.4).
To physically install your sensor, follow the instructions below.
The water reservoir holds up to 500 mL of distilled water. Under normal operating conditions, you should expect the water reservoir to last for ~120 days between refills. The video and instructions below cover how to refill the water reservoir.
Before storing or shipping your MODULAIR-UFP, it is important to ensure water is removed from the internals of the system to avoid breaking internal components. When water freezes, it expands, which can cause some internal subcomponents (e.g., the Nafion) to break. Before putting the MODULAIR-UFP in its shipping case, purge the water line several times as described in Step 6 of Section 3.5.1 above.
There are three ways in which you can access data for the MODULAIR-UFP:
Local Storage. Raw, 10-second resolution data is available for download directly from the onboard 16GB µSD card.
Web User Interface. Data can be downloaded directly from the QuantAQ Cloud in CSV format.
API. Data can be accessed programmatically via the QuantAQ API.
Data is collected and saved to an onboard µSD card every 10 seconds. Each minute, these values are averaged and pushed to the QuantAQ Cloud, where they are available for you to view, interact with, and download. It is unlikely you will ever need the locally stored data, but it is available to you if you would like to use it.
On the µSD card, you will find files with names like DATA_{YYYYMMDD}@FW{VERSION}.csv where YYYYMMDD represents the UTC date and VERSION represents the firmware version of the device. In the event a firmware update takes place mid-day, a new file will be created for that date.
Data files are written each day and can be read or analyzed using any programming language or spreadsheet program (e.g., Microsoft Excel). Each file begins with three metadata rows describing the device model (row 1), device ID (row 2), and device serial number (row 3). Row 4 contains the data header columns, and rows 5 and higher contain data. Each row corresponds to a new record.
Table 4.1 below documents the columns available in the downloaded data, their units, and their description.
Data are pushed to the QuantAQ Cloud with 1-minute time resolution and can be downloaded via the API or via the web app as a CSV. When downloading data, you can select whether you would like to download the raw data, final data, or raw+final data. Generally, the final data is what is desired, as it contains the final, cleaned data that is ready for analysis. The raw data is well-suited for researchers trying to investigate specific questions. When downloaded, the data is exported as a CSV and contains the following columns:
For details on how to use the API to download data, please view the API docs . The names, units, and descriptions for key-value pairs retrieved via the API are identical to those found in the section above, though they may be embedded beneath a key (e.g., all meteorological data is shown under the met key). Data is returned as JSON, as shown in the example below:
Coming soon.
Please see our for a full history of all firmware changes.
Wind Direction
0 to 60 m/s
3% RMSE
Wind Speed
0º to 360º
+/- 3º
AC/DC 12VDC Power Brick
M12 Power Cable
6 mL syringe
Pole Mount Components Bag
(2) Pole Mount Back Plates
(4) 1/4"-20, 3" Carriage Bolts
(4) 1/4"-20 nuts
(4) 10-32, 3/8" screws
Using the provided 3/8", 10-32 screws, partially screw each one into the fasteners in each corner on the back of the MODULAIR-UFP.
During shipping and installation, the insect shield can become wedged against the base of the MODULAIR-UFP. Make sure it is properly seated, approximately 1" away from the base of the Swagelok fitting. See the image below for an example of how it should be positioned. When seated properly, you will feel the internal o-ring slip into place.
Disconnect the water line that runs from the CPC to the water reservoir by pressing the button on the front of the fitting attached to the lid of the water reservoir. Carefully remove the water reservoir from its cradle and fill it with up to 500 mL of distilled water (or cleaner). Reinsert the water reservoir by sliding it into the cradle, while pushing up on the cradle from underneath to prevent the load cell from being depressed too hard. Then, reattach the water line that connects the water reservoir to the CPC. A detailed view of this step can be seen in the video located in Section 3.5.1 below.
Inside the MODULAIR-UFP, you will see the power switch toward the upper left-hand side. Slide the power switch to the right into the on position.
At this point, the Status LED will begin blinking, and within a few minutes, it should begin breathing cyan, which indicates it is connected to the internet and to the QuantAQ Cloud.
Carefully remove the water reservoir from its cradle by pulling it up and out toward you. You can use a second hand to hold the cradle in place or wiggle the reservoir back and forth if it is a tight fit.
soc
%
LiPo battery State of Charge
sample_temp
ºC
Internal box temperature
sample_rh
%
Internal box relative humidity
wx_ws
m/s
Vector Wind speed, as measured by the MaxiMet GMX500
wx_wd
deg
Vector Wind direction, as measured by the MaxiMet GMX500
wx_ws_scalar
m/s
Scalar wind speed, as measured by the MaxiMet GMX500
wx_u
The u-component of the wind speed/direction
wx_v
The v-component of the wind speed/direction
wx_pressure
hPa
Ambient pressure, as measured by the MaxiMet GMX500
wx_temp
ºC
Ambient temperature, as measured by the MaxiMet GMX500
wx_rh
%
Ambient relative humidity, as measured by the MaxiMet GMX500
wx_dew_point
ºC
Ambient dew point, as measured by the MaxiMet GMX500
cpc_elapsed_seconds
s
Seconds since the CPC started up.
cpc_serial_number
Serial Number of the CPC subcomponent.
cpc_particle_number_conc
p/cc
Raw particle number concentration
cpc_particle_number_conc_corr
p/cc
Particle number concentration with nominal correction for high concentrations.
cpc_sample_number
The sample number, auto-incrementing
cpc_flag
The current flag of the CPC subcomponent
cpc_pressure_at_beginning
hPa
Pressure reading in cell when particle counting begins
cpc_pressure_at_end
hPa
Pressure reading in cell when particle counting ends
cpc_pressure_ambient
hPa
Ambient pressure, as measured by the CPC subcomponent
cpc_temperature_ambient
ºC
Ambient temperature, as measured by the CPC subcomponent
cpc_temperature_at_input
ºC
Temperature at the CPC input valve
cpc_humidity_at_input
%
Relative humidity at the CPC input valve
cpc_dew_point_at_input
ºC
Dew point at CPC input valve
cpc_temperature_at_output
ºC
Temperature at the CPC output valve
cpc_humidity_at_output
%
Relative humidity at the CPC output valve
cpc_dew_point_at_output
ºC
Dew point at the CPC output valve
cpc_particle_count
Number of detected particles during the count interval
cpc_particle_count_corr
Dead-time corrected particle count
cpc_flush_time_ms
ms
Cell flush time
cpc_humidification_time_ms
ms
Cell humidification time
cpc_expansion_time_start
Time after start of expansion that counting starts
cpc_expansion_time_end
Time after start of expansion that counting ends
cpc_dead_time_corr_factor
Dead-time correction factor
cpc_power_to_pump
%
Power to the pump
cpc_k_factor
Conversion factor used to calculate the number concentration including cell volume and conversion of pressure reading into appropriate units
sn
sample_rh
%
sample_temp
ºC
lat
lon
device_state
wx_ws
wx_wd
wx_ws_scalar
wx_u
wx_v
wx_pressure
hPa
wx_temp
ºC
wx_rh
%
wx_dew_point
ºC
cpc_elapsed_seconds
cpc_serial_number
cpc_flag
cpc_pressure_at_beginning
hPa
cpc_pressure_at_end
hPa
cpc_pressure_ambient
hPa
cpc_temperature_ambient
ºC
cpc_temperature_at_input
ºC
cpc_temperature_at_output
ºC
cpc_humidity_at_input
%
cpc_humidity_at_output
%
cpc_dew_point_at_input
ºC
cpc_dew_point_at_output
ºC
cpc_particle_count
cpc_particle_count_corr
cpc_particle_number_conc
cpc_flush_time_ms
cpc_humidification_time_ms
cpc_expansion_time_start
cpc_expansion_time_end
cpc_dead_time_corr_factor
cpc_power_to_pump
cpc_k_factor
cpc_particle_number_conc_corr
p/cc
Datasheet
Total Number Concentration
0 to 100,000 p/cc
+/- 10%
Temperature*
-40ºC to 70ºC
+/- 0.3ºC
Relative Humidity
0 to 100%
+/- 2%
Pressure
300 to 1,250 hPa
0.4 hPa
🔋 Power
12V 5W average consumption
📶 Communication
North America LTE Cat M1 with 2G fallback Wi-Fi (2.4GHz or 5GHz) EMEAA LTE CAT1 with 2G/3G fallback Wi-Fi (2.4GHz or 5GHz)
📈 Data
Web interface (quant-aq.com) Programmatic access (QuantAQ API) Local storage (16GB µSD card)
Weatherproof rating
IP67
Operating temperature
5ºC to 45ºC*
Operating humidity
05 to 95%, non-condensing
Dimensions
25.34" x 10.6" x 5.22"
Weight
10 lbs (4.5 kg)
timestamp
Timestamp, UTC, ISO format
fw
Firmare version
flag
timestamp
id
timestamp_local









Please note that configuring Wi-Fi is *not* required for operation. All MODULAIR devices have cellular modems, and Wi-Fi is a fallback in the event you are operating in an area that does not have a reliable cellular connection.
To configure Wi-Fi credentials for your device, use our web-based configuration tool or visit https://app.quant-aq.com/wifi-setup. Complete instructions can be found in our Help Center. The MODULAIR can store up to ten separate credentials before they begin to be overwritten.
As all QuantAQ products are internet-connected, it is important to consider connectivity when choosing an installation location. There are three primary things to consider:
Antenna Connection. If your device has an external antenna, ensure it is seated securely and placed at a 90º angle pointing toward the sky.
Antenna Placement. Do not place the device near metal objects or other sources of RF (i.e., antenna). Keep the antenna at least 18" away from metal objects as they can cause distortions and reflections.
Location and Cellular Availability. Install your sensor in a location with a known cellular signal on the carriers we support.
Each record contains a status flag, stored as an unsigned integer, that describes the state of the device for that exact record. Flags contain encoded information about each of the sub-components onboard the device. They are generated via a bitmask and can be decoded by reversing the procedure. To determine whether a specific flag is set, you can use the bitwise AND operator. If the value of the flag is returned, then the flag is set. If a zero is returned, the flag is not set.
To make this a bit clearer, let's follow this example. Let's assume the value of the flag is set to "4". We can perform a bitwise AND operation to check the result to see if FLAG_STARTUP is set.
The table below describes the available flags, flag values, and a description of what they mean and what action should be taken when they are set.
The Status LED on the front panel is used to communicate the status of the internet connection. The LED changes color and pattern, each of which indicates a different state as outlined below. The rate at which the LED blinks comes in two flavors: blinking and breathing, where breathing implies a slow pulse where the color of the LED fades in and out.
Green
Blinking
Looking for Internet
If your device is blinking green, it is trying to connect to the cellular network. There is no need to take any action.
Breathing
Cloud not Connected
MODULAIR-UFP flag
// Some code
{
"data": [
{
"cpc_particle_number_conc_corr": 54960,
"geo": {
"lat": null,
"lon": null
},
"met": {
"wx_dew_point": 14.37,
"wx_pressure": 1011.68,
"wx_rh": 39.43,
"wx_temp": 29.6,
"wx_u": -0.309,
"wx_v": 2.256,
"wx_wd": 352.21,
"wx_ws": 2.28,
"wx_ws_scalar": 2.35
},
"raw_data_id": 1,
"sn": "MOD-UFP-00003",
"timestamp": "2025-06-12T23:36:45",
"timestamp_local": "2025-06-12T19:36:45",
"url": "https://api.quant-aq.com/v1/devices/MOD-UFP-00003/data/1"
},
...
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-UFP-00003/data/?page=1&per_page=50&limit=3",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/MOD-UFP-00003/data/?page=1&per_page=50&limit=3",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 3
}
}# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0
# bit AND - is FLAG_NEPH set?
>>> 4 & 4
4This flag is set when the CO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO
32
This flag is set when the NO sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_NO2
64
This flag is set when the NO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_O3
128
This flag is set when the O3 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_CO2
256
This flag is set when the CO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_SO2
512
This flag is set when the SO2 sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_H2S
1024
This flag is set when the H2S sensor has failed or data does not meet initial on-board QA/QC.
Remove any rows where this flag is set.
FLAG_BAT
2048
This flag is set when the internal LiPo battery is low or dead.
None.
FLAG_OVERHEAT
4096
This flag is set when the OPC has overheated.
Contact QuantAQ.
FLAG_SD
8192
This flag is set when the SD card has failed.
Replace the SD card.
FLAG_STARTUP
1
This flag is set when the device powers on.
Remove any rows where this flag is set.
FLAG_OPC
2
This flag is set when the OPC has indicated the data failed to transfer correctly. This can be caused by the fan being off, the laser being off, or the checksum not validating properly.
Remove any rows where this flag is set.
FLAG_NEPH
4
This flag is set when the nephelometer has indicated the data failed to transfer correctly.
Remove any rows where this flag is set.
FLAG_RHTP
8
This flag is set when the relative humidity and temperature sensor has failed.
Remove any rows where this flag is set.
FLAG_CO
If your device is breathing green, it has a cellular connection but has not been able to connect to the cloud.
Cyan
Blinking
Connecting to the Cloud
Blinking cyan indicates the device has a cellular connection and is attempting to connect to the cloud. There is no need to take any action. This will happen each time on device startup.
Breathing
Connected
When your device is breathing cyan, everything is good and you are happily connected to the internet and the QuantAQ Cloud.
Magenta
Blinking
Firmware Update
When your device is blinking magenta, it is undergoing an over-the-air firmware update. DO NOT power off when this is happening.
White
Breathing
Internet Off
If the LED is breathing white, the cellular connection has been turned off. If you did not explicitly turn off the cellular connection via the onboard switch, please notify QuantAQ.
Red
Blinking
System Failure
A system failure has occurred. This is likely caused by faulty on-board firmware or corrupted memory. Please contact QuantAQ for next steps.


16
Each device ships with a Registration Card containing a QR code and a short confirmation code. Follow the instructions below to register your device.
The QuantAQ Cloud API allows you to manage your air quality sensors and data in a simple, programmatic way using conventional HTTP requests. Each endpoint is intuitive and allows you to obtain data and execute various actions easily. If you notice something that can be made more clear or more intuitive, please let us know!
This documentation will begin with a general overview of the API and how it works, followed by details on each endpoint that is available in *v1* of the API. Throughout this documentation, there will be code examples using httpie - an easy-to-use command-line client for making HTTP requests. The names of specific resources will be represented by variables, which are wrapped in "<>".
Authentication is handled using HTTP Basic Auth, which consists of sending an API key that is unique to your account with each request. This key should be kept secret and not shared with anyone. This API key is tied to your user account and will only allow you to take actions within your assigned scope of permissions.
You can generate an API key for your account by visiting the Developer section within the QuantAQ Cloud and clicking Generate New Key in the upper right-hand corner of your screen. It is recommended that you set this key as an environment variable on your computer with the name QUANTAQ_APIKEY.
To include your API key in your request, add an HTTP Authorization header, consisting of a usernameand password. When using httpie, you can use the -aflag to indicate authorization. The API key serves as the username, and the password should be left blank.
To make an API call, you need four pieces of information:
api_key: a random string of alphanumeric characters that gives you access to the API
endpoint: the URI listed in the API reference section below
method: one of GET, POST, PUT, or DELETE
More often than not, you will be sending either GET or POST requests to api.quant-aq.com. All API endpoints begin with the same URL, which, for the QuantAQ Cloud, is api.quant-aq.com/. The full URL will be of the form:
The version of the API may change (this will be documented), which signals changes in the underlying structure of the API. For now, there is only one version available: v1. Throughout these docs, we will just assume the version is v1.
A good first API call would be to get your account information. As mentioned above, we will be using httpie for examples. To get your account information, the API call would look like:
You should see a response that looks something like the following:
Any tool that is fluent in HTTP requests and supports HTTP basic authentication protocols can be used to communicate with the QuantAQ Cloud API. Requests must be made using HTTPS. The interface response depends on the action required.
Each request that is made to the API will have an attached status code that tells you whether the request was successful or not. If there is an issue with the request, an error will be returned as indicated by both the HTTP status code and the response body. In general, if the status code is in the 200's, the request was successful. If the status code is in the 400's, there was an error with the request; this could range from improper authentication to an illegal operation (e.g., you were trying to request data for which you do not have the necessary permissions). If a 500 error is returned, there was a server-side error, which means we were unable to process the request for some reason.
An example error response:
Rate limiting is set for the API at 150 requests/minute for all data endpoints. If you have exceeded this limit, you will receive a 429 status code and will need to wait until the next minute to make more requests.
This is an object representing your account information. You can retrieve it to see basic information about your account, as summarized in the attributes section below.
GET /v1/account
Retrieves the current account information for the user who is making the request.
Path Parameters
None.
Query Parameters
None.
Response
Body
This is an object representing a QuantAQ device. You can retrieve device information, either on an individual sensor basis or as a list to see basic information about the device(s), as summarized in the attributes section below. You can also update the information for a single device or delete a device.
GET /v1/devices/{serial_number}
Retrieves the information for a single device by its serial number.
Path Parameters
Query Parameters
None.
Response
Body
GET /v1/devices
Retrieves a paginated list of devices including all devices the user has access to across Organizations and Networks. If no Devices are available, an empty list will be returned.
Path Parameters
None.
Query Parameters
Response
Body
Please see the table in the for detailed body information.
Meta
PUT /v1/devices/{serial_number}
Retrieves the information for a single device by its serial number.
Path Parameters
Query Parameters
Response
Body
Please see the table in the for detailed body information.
This is an object representing an Organization. You can retrieve it to see basic information about a given Organization including the members and devices, as summarized in the attributes section below.
GET /v1/orgs/{org_id}
Retrieve the information for a single Organization by its Organization ID. The user must be a confirmed member of the Organization, or the endpoint will return a 403.
Path Parameters
Query Parameters
None.
Response
Body
GET /v1/orgs/
Retrieves a list of all organizations the user account has access to. This endpoint returns a paginated list of Organization objects. The call will return an empty list if no Organizations met the provided parameters, or if the requester is not a confirmed member of any Organizations (though they should be the member of their own sandbox).
Path Parameters
None.
Query Parameters
Response
Body
Please see the section above for details on the response body.
Meta
This is an object representing a Network. You can retrieve it to see basic information about a given Network including the members and Devices.
GET /v1/orgs/{org_id}/{network_id}
Retrieve the information for a single Network by its Organization ID and Network ID. The user must be a confirmed member of the Network, or the endpoint will return a 403.
Path Parameters
Query Parameters
None.
Response
Body
GET /v1/orgs/{org_id}/networks/
Retrieves a list of all visible Networks belonging to a given Organization. This endpoint is scoped behind the Organization endpoint, so you must provide an Organization ID. An Organization’s Network is visible to a user if they are an Organization administrator or a member of the Network. The Organization must be visible to the requester, or the endpoint will return a 403.
Path Parameters
Query Parameters
Response
Body
Please see the section above for details on the response body.
Meta
This is an object representing your data for a given Device. You can retrieve it as a list for either raw or final data
GET /v1/devices/{serial_number}/data/
Retrieves a paginated list of data for a specific device using its serial number.
Path Parameters
Query Parameters
Response
Body
Please see the product manual for the type of Device you are querying for details on the response body. These are located in the "Hardware" section of these docs.
Meta
GET /v1/devices/{serial_number}/data/raw/
Retrieves a paginated list of raw data for a specific device using its serial number.
Path Parameters
Query Parameters
Response
Body
Please see the product manual for the type of Device you are querying for details on the response body. These are located in the "Hardware" section of these docs.
Meta
This is an object representing your data for a given Device, as queried by date. You can retrieve it as a list for either raw or final data.
GET /v1/devices/{serial_number}/data-by-date/{date}/
Retrieves a paginated list of final data for a specific device using its serial number for a specific date.
Path Parameters
Query Parameters
Response
Body
Please see the product manual for the type of Device you are querying for details on the response body. These are located in the "Hardware" section of these docs.
Meta
GET /v1/devices/{serial_number}/data-by-date/raw/{date}/
Retrieves a paginated list of raw data for a specific device using its serial number for a specific date.
Path Parameters
Query Parameters
Response
Body
Please see the product manual for the type of Device you are querying for details on the response body. These are located in the "Hardware" section of these docs.
Meta
Retrieve the most recent data record for either a single Device (by serial number), a Network (id), or an Organization (id). A list will be returned for any of them.
GET /v1/data/most-recent/
Retrieves the data for a specific Device using its serial number or a list of Devices using an Organization ID or Network ID. If multiple parameters are used, the devices from which data is fetched must meet all conditions.
Path Parameters
None.
Query Parameters
At least one of sn, org_id, or network_id must be provided otherwise a 400 error will be returned.
Response
Body
Please see the product manual for the type of Device you are querying for details on the response body. These are located in the "Hardware" section of these docs.
Meta
The attributes for the resampled data object depend on the model of the Device and will always return the final data. Generally, a list is returned containing all available data for that Device, per period.
The data returned from this endpoint differs from others in several ways. Some further remarks on the structure and contents:
Data entries may be null, if there are no measurements for that period, or if the number of measurements does not meet the completeness criterion. For more information refer to .
Periods are included even if no measurements meet the completeness criterion.
The number of data records (of any sort) is provided in n_datapoints. Note that this does not indicate that every data record has a valid measurement for every listed pollutant, since components may operate independently of each other.
Retrieves the data for a specific device using its serial number.
GET /v1/data/resampled/
Path Parameters
None.
Query Parameters
sn, start_date, end_date, and period must be provided otherwise a 400 error will be returned.
Response
Body
The data available will depend on the device in question, but will be shaped roughly like the following, with one object per time period. Consult the Hardware section of the documentation for a sense of what columns your device supports.
Most QuantAQ Cloud API endpoints support advanced queries that allow you to filter, limit, and sort your results. All endpoints that return paginated data - such as retrieving data points - support these requests.
To filter a query, use the filter keyword argument with the format filter=<parameter>,<filter spec>,<value>. Multiple filters can be combined using a ; to build complex queries. For example, if we want to return the data points where PM2.5 is between 25 and 50 µg/m3, we would write filter=pm25,ge,25;pm25,le,50;.
A full request might then look like:
The following filter specs are supported and available to use:
eq: = (equals)
ne: ≠ (not equals)
lt: < (less than)
To limit the number of data points returned for any given request, use the limit keyword argument with the number of data you would like returned. For example, to return just the first 5 items, use limit=5. If you are calling an endpoint that returns paginated data and would like to return a specific number of data per page, you can alternatively (or additionally) use the per_page keyword argument.
To return data in a specific order, you can use the sort keyword argument with format sort=<parameter>,<order> where order is one of asc or desc. For example, if you want to return the data descended by timestamp:
is the official python API wrapper for the QuantAQ Cloud API and is maintained and supported by QuantAQ. Full documentation can be found . For questions specfiic to py-quantaq, please use the .
is the official R API wrapper for the QuantAQ Cloud API and is maintained and supported by QuantAQ. Full documentation can be found . For questions specfiic to R-quantaq, please use the .
arguments: JSON-encoded values sent to the method (these are not always required)
last_name
string
The last name of the account user
id
int
The unique identifier for the account user
last_seen
datetime
The last time the account user was seen
member_since
datetime
The timestamp corresponding to when the user joined the site
geo.lat
float
The latitude corresponding to the geolocation of the device
geo.lon
float
The longitude corresponding to the geolocation of the device
id
int
The unique identifier for the device
model
string
The device model: one of [ modulair, modulair_pm, arisense_v200 ]
last_seen
datetime
The last time the device was seen
n_datapoints
int
The total number of data points the device has collected over its lifetime
*no longer valid
owner_id
int
The id of the device owner
private
boolean
True if the device is marked as private by the device owner
sn
string
The serial number of the device
status
string
The current operation status of the device. One of: [ CALIBRATION, ACTIVE, RETIRED, PRE_REGISTERED ]
timezone
string
The timezone corresponding to the location where the device is installed
url
string
The url corresponding to the device
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
lon
float
The longitude corresponding to the geolocation of the device
is_private
boolean
True if the device is marked as private by the device owner
device_state
string
The current operation status of the device. One of: [ CALIBRATION, ACTIVE, RETIRED, PRE_REGISTERED ]
timezone
string
The timezone corresponding to the location where the device is installed
sandbox
boolean
true if a Sandbox Organization, otherwise false
members
list
A list containing the confirmed members of the Organization that are visible to the requesting user. Organization administrators can see all Organization members. Each entry is a sub-object representing an Organization user including their role and username.
devices
list
A list containing the serial number of all Devices associated with the Organization that are visible to the requesting user. An administrator can see all Organization-managed devices, while a non-administrator can see the Devices for the Networks they are a member of.
networks
list
A list containing the IDs of all Networks associated with the Organization that are visible to the requesting user.
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
members
list
A list containing the confirmed members of the Network that are visible to the requesting user.
devices
list
A list containing the serial number of all Devices associated with the Network.
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
limit
int, optional
Please see the advanced queries section at the bottom of this page for more information
Periods are computed using the device’s local timezone. Across Daylight Savings Time borders, there may be more or less time represented by a given period. Further discussion here.
Times are provided in both local and UTC time, with offsets included.
Averaging is done naively across all data within the period and is not intended to match the National Ambient Air Quality Standard (NAAQS) or other specific averaging logic and is provided for convenience only
gt: > (greater than)ge: ≥ (greater than or equal to)
le: ≤ (less than or equal to)
in: in
like: like
January 11th, 2021
the devices/ endpoint was updated to allow for a new parameter (team) which permits users to query available devices by team name. Simply add ?team=team-1 and you will only be returned the available devices for the requested team. If the team name does not exist or have any devices, an empty list will be returned. If you would like to return all available devices across all of your teams, simply omit the team parameter as before.
username
string
The accounts username
confirmed
boolean
True if the account user has confirmed their email address
email
string
The email address of record for the user
first_name
string
The first name of the account user
serial_number
string
The serial number of the device
city
string
The city in which the device is installed
country
string
2-digit ISO country code corresponding to the country where the device is installed
created
datetime
The timestamp corresponding to when the device was brought online
description
string
The user-defined device description
org_id
int, optional
The ID of the Organization to subquery
network_id
int, optional
The ID of the Network to subquery
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
serial_number
string
The serial number of the device
city
string
The city in which the device is installed
country
string
2-digit ISO country code corresponding to the country where the device is installed
description
string
The user-defined device description
lat
float
The latitude corresponding to the geolocation of the device
org_id
int
The ID of the Organization
name
string
The name of the Organization
id
string
The unique identifier for the Organization
description
string
A short description of the Organization
created_on
datetime
An ISO-formatted timestamp representing the creation date of the Organization
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
org_id
int
The ID of the Organization
network_id
int
The ID of the Network
name
string
The name of the Network
id
string
The unique identifier for the Network
description
string
A short description of the Network
created_on
datetime
An ISO-formatted timestamp representing the creation date of the Network
org_id
int
The ID of the Organization
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
serial_number
string
The serial number of the device you would like to query
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
serial_number
string
The serial number of the device you would like to query
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
serial_number
string
The serial number of the device you would like to query
date
string
The date for which you would like to return data. The format must be YYYY-MM-DD and all dates are in GMT. Thus, if you request data for 2022-01-01, it will return all data for the device on Jan. 1st GMT.
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
serial_number
string
The serial number of the device you would like to query
date
string
The date for which you would like to return data. The format must be YYYY-MM-DD and all dates are in GMT. Thus, if you request data for 2022-01-01, it will return all data for the device on Jan. 1st GMT.
per_page
int
The number of items to return per page (default=50)
page
int
The page number to return (default=1)
sort
string, optional
Please see the advanced queries section at the bottom of this page for more information
filter
string, optional
Please see the advanced queries section at the bottom of this page for more information
sn
string
The serial number of the device in question.
org_id
int
The ID of the Organization.
network_id
int
The ID of the Network.
per_page
int
The number of items to return per page (default=50)
sn
string, required
The serial number of the device in question.
start_date
string, required
The ID of the Organization.
end_date
string, required
The ID of the Network.
period
string, required
The length of period at which the data should be resampled. Options: 15m (15 minutes), 1h (1 hour), 8h (8 hours), 1d (1 day)
September 24th, 2024
The Resampled Data endpoint now omits future periods on the current day instead of including them as null.
February 27th, 2024
A Resampled Data endpoint was added (/v1/data/resampled/)
December 28th, 2023
All teams-related endpoints and parameters were removed, following deprecation in Summer 2023
After significant user feedback, “Public” devices are no longer accessible via the API to unauthorized users without Org or Network access. (Public devices remain visible through the QuantAQ Cloud web app)
November 7th, 2023
Several new endpoints were added, to accommodate organization and network requests:
/v1/orgs/
/v1/orgs/<org_id>/
/v1/orgs/<org_id>/networks/
/v1/orgs/<org_id>/networks/<network_id>
Two endpoints were changed to permit filtering by organization and network:
/v1/data/most-recent/ now accepts optional org_id and network_id filtering parameters
/v1/data/devices/ now accepts optional org_id
March 31st, 2022
Two new endpoints were added (/devices/<sn>/data-by-date/<date>/, /devices/<sn>/data-by-date/raw/<date>/) to allow users to more efficiently query large amounts of data
January 26th, 2022
A new endpoint was added (/data/most-recent/) to allow users to query the most recent data for a single device or team of devices.
https://api.quant-aq.com/{version}/{endpoint}$ http -a <your-api-key-here>: GET \
https://api.quant-aq.com/v1/account{
"confirmed": true,
"email": "[email protected]",
"first_name": "First Name",
"id": 1,
"is_administrator": false,
"last_name": "Last Name",
"last_seen": "2020-09-28T13:12:33.745041",
"member_since": "2020-06-05T22:05:24.612347",
"role": 5,
"username": "username"
}HTTP/1.1 403 Forbidden
{
"id": "forbidden",
"message": "You do not have permissions for this action."
}{
"confirmed": true,
"email": "[email protected]",
"first_name": "First Name",
"id": 1,
"last_name": "Last Name",
"last_seen": "2020-09-28T13:12:33.745041",
"member_since": "2020-06-05T22:05:24.612347",
"role": 5,
"username": "username"
}{
"error": "Invalid request"
}{
"city": "Boston",
"country": null,
"created": "2019-12-08T23:23:28.107099",
"description": null,
"geo": {
"lat": null,
"lon": null
},
"id": 6,
"last_seen": "2019-12-08T23:23:28.107106",
"model": "arisense_v200",
"n_datapoints": 0,
"outdoors": true,
"owner_id": 1,
"private": true,
"sn": "a123456",
"status": "INACTIVE",
"timezone": null,
"url": "https://api.quant-aq.com/device-api/v1/devices/a123456"
}{
"error": "Invalid request"
}{
"data": [
{
"city": "New City",
"country": "US",
"created": "2019-03-03T17:50:16.829776",
"description": "",
"geo": {
"lat": 42.5,
"lon": -71.1
},
"id": 1,
"last_seen": "2019-12-06T22:57:05.917175",
"model": "arisense_v200",
"n_datapoints": 4048,
"outdoors": true,
"owner_id": 1,
"private": true,
"sn": "SN000-001",
"status": "CALIBRATION",
"timezone": "US/Eastern",
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001"
},
...
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/?page=1&per_page=50",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/?page=1&per_page=50",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 3
}
}{
"error": "Invalid request"
}{
"city": "Boston",
"country": null,
"created": "2019-12-08T23:23:28.107099",
"description": null,
"geo": {
"lat": null,
"lon": null
},
"id": 6,
"last_seen": "2019-12-08T23:23:28.107106",
"model": "arisense_v200",
"n_datapoints": 0,
"outdoors": true,
"owner_id": 1,
"private": true,
"sn": "a123456",
"status": "INACTIVE",
"timezone": null,
"url": "https://api.quant-aq.com/device-api/v1/devices/a123456"
}{
"error": "Invalid request"
}{
"name": "Org 1"
"id": 1,
"description": "Where Org 1 things live.",
"created_on": "2023-11-07T00:00:00.000000+00:00",
"sandbox": false,
"members": [
{
"role": "admin",
"user": "user-1"
},
{
"role": "member",
"user": "user-2"
}
],
"devices": [],
"networks": []
}{
"error": "Invalid request"
}{
"data": [
{
"name": "Org 1"
"id": 1,
"description": "Where Org 1 things live.",
"created_on": "2023-11-07T00:00:00.000000+00:00",
"sandbox": false,
"members": [
{
"role": "admin",
"user": "user-1"
},
{
"role": "member",
"user": "user-2"
}
],
"devices": [],
"networks": []
}
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/orgs/?page=1&per_page=50",
"last_url": "https://api.quant-aq.com/device-api/v1/orgs/?page=1&per_page=50",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 1
}
}{
"error": "Invalid request"
}{
"name": "Network 1",
"id": 1,
"description": "Where Network 1 things live.",
"organization": 1,
"created_on": "2023-11-07T00:00:00.000000+00:00",
"members": [
{
"role": "Operator",
"user": "user1"
},
{
"role": "Researcher",
"user": "user2"
},
],
"devices": []
}
{
"error": "Invalid request"
}{
"data": [
{
"name": "Network 1",
"id": 1,
"description": "Where Network 1 things live.",
"organization": 1,
"created_on": "2023-11-07T00:00:00.000000+00:00",
"members": [
{
"role": "Operator",
"user": "user1"
},
{
"role": "Researcher",
"user": "user2"
},
],
"devices": []
}
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/orgs/1/networks/?page=1&per_page=50",
"last_url": "https://api.quant-aq.com/device-api/v1/orgs/1/networks/?page=1&per_page=50",
"next_url": null,
"page": 1,
"pages": 1,
"per_page": 50,
"prev_url": null,
"total": 1
}
}{
"error": "Invalid request"
}{
"data": [
{
"co": 51.106268512085,
"co2": 421.793483200912,
"geo": {
"lat": 40.9844188816344,
"lon": 105.561207967016
},
"no": 10.2810514330163,
"no2": 56.8233499407749,
"noise": 6.29058420281369,
"o3": 37.946070157595,
"pm1": 8.91967278706223,
"pm10": 14.2017895600789,
"pm25": 9.07509558015509,
"pressure": 101454.562990336,
"rh_manifold": 73.2982119788483,
"sn": "SN000-001",
"solar": 8.49282458496783,
"temp_box": 35.226457866451,
"temp_manifold": 7.28921112549997,
"timestamp": "2020-06-08T15:31:16.895459",
"timestamp_local": "2020-06-08T09:31:16.895459",
"tvoc": null,
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/19",
"wind_dir": 323.38596795112,
"wind_speed": 99.8816892936835
}
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/?page=1&per_page=50&limit=100",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/?page=2&per_page=50&limit=100",
"next_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/?page=2&per_page=50&limit=100",
"page": 1,
"pages": 2,
"per_page": 50,
"prev_url": null,
"total": 100
}
}{
"error": "Invalid request"
}{
"data": [
{
"bin0": 286.647741870419,
"bin1": 551.701930611041,
"bin10": 46.7706898657725,
"bin11": 29.584787450594,
"bin12": 50.7844931631582,
"bin13": 21.5517228689086,
"bin14": 44.4108140986913,
"bin2": 221.637921828236,
"bin3": 275.16465539171,
"bin4": 312.552750081673,
"bin5": 224.606340244391,
"bin6": 230.723866268078,
"bin7": 40.6604798027605,
"bin8": 86.764139275662,
"bin9": 76.3482566483437,
"co2_raw": 959.118224004688,
"co_ae": 911.5526546364,
"co_diff": null,
"co_we": 467.476827385698,
"dew_point": 2.1147447373898,
"flag": 64,
"geo": {
"lat": 40.9844188816344,
"lon": 105.561207967016
},
"no2_ae": 579.782539043588,
"no2_diff": null,
"no2_we": 614.951076396963,
"no_ae": 789.090772676965,
"no_diff": null,
"no_we": 439.438007376347,
"noise": 6.29058420281369,
"o3_ae": 455.557344482557,
"o3_diff": null,
"o3_we": 669.05302084695,
"opc_flow": 0.569001807871506,
"opc_sample_time": null,
"pressure": 101454.562990336,
"rh_manifold": 73.2982119788483,
"sn": "SN000-001",
"solar": 8.49282458496783,
"temp_box": 35.226457866451,
"temp_manifold": 7.28921112549997,
"timestamp": "2020-06-08T15:31:16.895459",
"timestamp_local": "2020-06-08T09:31:16.895459",
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/raw/19",
"voc_raw": 139.457791015991,
"wind_dir": 323.38596795112,
"wind_speed": 99.8816892936835
}
],
"meta": {
"first_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/raw/?page=1&per_page=50&limit=100",
"last_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/raw/?page=2&per_page=50&limit=100",
"next_url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/raw/?page=2&per_page=50&limit=100",
"page": 1,
"pages": 2,
"per_page": 50,
"prev_url": null,
"total": 100
}
}{
"error": "Invalid request"
}{
"data": [
{
"co": 51.1,
"co2": 421.7,
"geo": {
"lat": 40.984,
"lon": 105.561
},
"no": 10.2810514330163,
"no2": 56.8233499407749,
"o3": 37.946070157595,
"pm1": 8.91967278706223,
"pm10": 14.2017895600789,
"pm25": 9.07509558015509,
"rh_manifold": 73.2982119788483,
"sn": "SN000-001",
"temp_box": 35.226457866451,
"temp_manifold": 7.28921112549997,
"timestamp": "2020-06-08T15:31:16.895459",
"timestamp_local": "2020-06-08T09:31:16.895459",
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/19",
"wind_dir": 323.38596795112,
"wind_speed": 99.8816892936835
}
],
"meta": {
"date": "2022-01-01",
"total": 100
}
}{
"error": "Invalid request"
}{
"data": [
{
"bin0": 286.647741870419,
"bin1": 551.701930611041,
"bin10": 46.7706898657725,
"bin11": 29.584787450594,
"bin12": 50.7844931631582,
"bin13": 21.5517228689086,
"bin14": 44.4108140986913,
"bin2": 221.637921828236,
"bin3": 275.16465539171,
"bin4": 312.552750081673,
"bin5": 224.606340244391,
"bin6": 230.723866268078,
"bin7": 40.6604798027605,
"bin8": 86.764139275662,
"bin9": 76.3482566483437,
"co2_raw": 959.118224004688,
"co_ae": 911.5526546364,
"co_diff": null,
"co_we": 467.476827385698,
"dew_point": 2.1147447373898,
"flag": 64,
"geo": {
"lat": 40.9844188816344,
"lon": 105.561207967016
},
"no2_ae": 579.782539043588,
"no2_diff": null,
"no2_we": 614.951076396963,
"no_ae": 789.090772676965,
"no_diff": null,
"no_we": 439.438007376347,
"noise": 6.29058420281369,
"o3_ae": 455.557344482557,
"o3_diff": null,
"o3_we": 669.05302084695,
"opc_flow": 0.569001807871506,
"opc_sample_time": null,
"pressure": 101454.562990336,
"rh_manifold": 73.2982119788483,
"sn": "SN000-001",
"solar": 8.49282458496783,
"temp_box": 35.226457866451,
"temp_manifold": 7.28921112549997,
"timestamp": "2020-06-08T15:31:16.895459",
"timestamp_local": "2020-06-08T09:31:16.895459",
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/raw/19",
"voc_raw": 139.457791015991,
"wind_dir": 323.38596795112,
"wind_speed": 99.8816892936835
}
],
"meta": {
"date": "2022-01-01",
"total": 100
}
}{
"error": "Invalid request"
}{
"data": [
{
"co": 51.106268512085,
"co2": 421.793483200912,
"geo": {
"lat": 40.9844188816344,
"lon": 105.561207967016
},
"no": 10.2810514330163,
"no2": 56.8233499407749,
"noise": 6.29058420281369,
"o3": 37.946070157595,
"pm1": 8.91967278706223,
"pm10": 14.2017895600789,
"pm25": 9.07509558015509,
"pressure": 101454.562990336,
"rh_manifold": 73.2982119788483,
"sn": "SN000-001",
"solar": 8.49282458496783,
"temp_box": 35.226457866451,
"temp_manifold": 7.28921112549997,
"timestamp": "2020-06-08T15:31:16.895459",
"timestamp_local": "2020-06-08T09:31:16.895459",
"tvoc": null,
"url": "https://api.quant-aq.com/device-api/v1/devices/SN000-001/data/19",
"wind_dir": 323.38596795112,
"wind_speed": 99.8816892936835
},
...
]
}{
"error": "Invalid request"
}{
"data": [
{
"co": 139.156,
"n_datapoints": 60,
"no": 3.705,
"no2": 2.367,
"o3": 42.106,
"period_end": "2025-05-27T01:00:00-07:00",
"period_end_utc": "2025-05-27T08:00:00+00:00",
"period_start": "2025-05-27T00:00:00-07:00",
"period_start_utc": "2025-05-27T07:00:00+00:00",
"pm1": 1.514,
"pm10": 14.993,
"pm25": 2.962,
"sample_rh": 62.408,
"sample_temp": 13.57,
"sn": "MOD-X-00001",
"wd": 62.148,
"ws": 0.896,
"ws_scalar": 1.006,
"wx_dew_point": 6.696,
"wx_pressure": 1019.945,
"wx_rh": 65.304,
"wx_temp": 12.985
},,
...
}{
"error": "bad request",
"message": "period parameter should be one of 1h|15m|8h|1d"
}$ http -a <your-api-key-here>: GET \
"https://api.quant-aq.com/device-api/v1/devices/<sn>/data/?filter=pm25,ge,25;pm25,le,50;"$ http -a <api-key>: GET \
https://api.quant-aq.com/device-api/v1/devices/<serial number>/data/?sort=timestamp,desc
network_idfirst_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
first_url
string
The url of the first page in the collection
last_url
string
The url of the last page in the collection
next_url
string
The url of the next page in the collection
prev_url
string
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query
The url of the previous url in the collection
page
int
The current page number
pages
int
The total number of pages available
per_page
int
The number of records returned per page
total
int
The total number of records available in the query