MODULAIR-UFP
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.
1. Introduction and Specs
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.
1.1 Specifications
1.1.1 Air Quality Measurements
Total Number Concentration
0 to 100,000 p/cc
Not yet determined.
Temperature*
-40ºC to 70ºC
+/- 0.3ºC
Relative Humidity
0 to 100%
+/- 2%
Pressure
300 to 1,250 hPa
0.4 hPa
Wind Direction
0 to 60 m/s
3% RMSE
Wind Speed
0º to 360º
+/- 3º
*This is the specification for the temperature measurement itself, not the safe operating temperature of the MODULAIR-UFP.
For more information on the operating principle of the CPC, please refer to Hering et al, 2025.
1.1.2 Power and Communications
🔋 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)
1.1.3 Operating Specifications
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)
*It is important to note that using the MODULAIR-UFP without proper winterization can lead to permanent, irreversible damage. The MODULAIR-UFP uses water as its operating liquid, and the instrument can be damaged if water internal to the system freezes and expands.
1.2 Certifications
Coming soon.
2. Sensor Overview
Coming soon.
3. Installation and Hardware Setup
3.1 Unpacking
Coming soon.
3.2 Device Registration
Each device ships with a Registration Card containing a QR code and a short confirmation code. Follow the instructions below to register your device.
3.3 Configuring Wi-Fi
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.
3.4 Installation
Coming soon.
3.5 Connectivity Considerations
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.
4. Software and Data
4.1 Data Structure and Outputs
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.
4.1.1 Local Storage
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.
timestamp
Timestamp, UTC, ISO format
fw
Firmare version
flag
MODULAIR-UFP flag
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
4.1.2 Data Stored on the QuantAQ Cloud
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:
timestamp
id
timestamp_local
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
4.1.3 Data Downloaded via API
For details on how to use the API to download data, please view the API docs here. 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:
// 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
}
}
4.2 Understanding the Status Flag
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.
# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0
# bit AND - is FLAG_NEPH set?
>>> 4 & 4
4
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.
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
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.
5. Maintenance and Service
Coming soon.
6. Changelog
Please see our public changelog for a full history of all firmware changes.
7. Appendix
7.1 Status LED
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
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.
Last updated
Was this helpful?