The application can be configured to send test data to a webhook URL. This is useful for integrating with other services or for custom data analysis.
The webhook URL can be configured in the settings panel. The application will send a POST request to this URL with a JSON payload. Make sure that appropriate CORS headers are configured.
The webhook is sent at the following times:
TEST_STARTED
: When a test is started.CONTINUE_TEST
: When a test is continued.TEST_FINISHED
: When a test is finished.NEW_DATA
: Whenever new channel data is received during a test run.DEVICE_READY
: When the device has finished heating up and is ready to start a test.ALREADY_TESTING
: When the device is already running a test.The payload is a JSON object with the following structure:
{
"version": 0,
"event": "string",
"device": {
"hwVersion": "string",
"swVersion": "string",
"deviceModel": "string",
"sn": "number",
"configuration": "string"
},
"test": {
"state": "string",
"result": "object",
"data": {
"temperatureSamples": [
{
"time": "string",
"temp": "number"
}
],
"samples": [
{
"startingChannel": "number",
"firstChannelResult": "number",
"samplingTime": "number",
"samplingTemperature": "number"
}
]
}
}
}
version
: The version of the webhook payload format. Currently 0
.event
: A string describing what triggered the webhook. See the "Triggers" section for possible values.The device
object contains information about the device that ran the test.
hwVersion
: The hardware version of the device.swVersion
: The software version of the device.deviceModel
: The model of the device.sn
: The serial number of the device.configuration
: The configuration of the device.The test
object contains information about the test itself.
state
: The current state of the test. This is a string that corresponds to the TestState
enum in the application code. The possible values are:
UNINITIALIZED
IDLE
TESTING
DONE
BLOCKED_ALREADY_TESTING
BLOCKED_NOT_READY
result
: The result of the test. This is only present when the test is finished. The structure of this object is:
{
"detectionType": "number",
"detectionFlowNumber": "number",
"detectionResult": "string",
"numberOfChannels": "number",
"startingChannel": "number",
"channelResults": ["string"],
"numberOfSubGroups": "number",
"subGroupResults": [
{
"result": "string",
"name": "string"
}
]
}
The detectionResult
field indicates the overall result of the test. The possible values are:
NEGATIVE
POSITIVE
INVALID
data
: The raw data from the test. This includes temperature samples and fluorescence readings.
{
"version": 0,
"event": "DEVICE_READY",
"test": {
"state": "IDLE",
"data": { "temperatureSamples": [], "samples": [] }
}
}
{
"version": 0,
"event": "ALREADY_TESTING",
"test": {
"state": "BLOCKED_ALREADY_TESTING",
"data": { "temperatureSamples": [], "samples": [] }
}
}
{
"version": 0,
"event": "TEST_STARTED",
"device": {
"hwVersion": "HV3.0.2",
"swVersion": "SV2.2.2.230619_Beta_V2",
"deviceModel": "PM001",
"sn": 0000000000,
"configuration": "CV1.22.7.20"
},
"test": {
"state": "TESTING",
"data": { "temperatureSamples": [], "samples": [] }
}
}
{
"version": 0,
"event": "CONTINUE_TEST",
"device": {
"hwVersion": "HV3.0.2",
"swVersion": "SV2.2.2.230619_Beta_V2",
"deviceModel": "PM001",
"sn": 0000000000,
"configuration": "CV1.22.7.20"
},
"test": {
"state": "TESTING",
"data": { "temperatureSamples": [], "samples": [] }
}
}
{
"version": 0,
"event": "NEW_DATA",
"device": {
"hwVersion": "HV3.0.2",
"swVersion": "SV2.2.2.230619_Beta_V2",
"deviceModel": "PM001",
"sn": 0000000000,
"configuration": "CV1.22.7.20"
},
"test": {
"state": "TESTING",
"data": {
"temperatureSamples": [
{ "time": "2025-06-30T16:10:13.802Z", "temp": 63.16767501831055 },
{ "time": "2025-06-30T16:10:15.872Z", "temp": 63.13431167602539 },
{ "time": "2025-06-30T16:10:17.851Z", "temp": 63.13431167602539 },
{ "time": "2025-06-30T16:10:20.057Z", "temp": 63.20106887817383 },
{ "time": "2025-06-30T16:10:21.677Z", "temp": 63.16767501831055 },
{ "time": "2025-06-30T16:10:23.747Z", "temp": 63.16767501831055 }
],
"samples": [
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 1,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 704
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 2,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 896
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 3,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 1088
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 4,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 448
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 5,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 1152
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 6,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 256
}
]
}
}
}
{
"version": 0,
"event": "TEST_FINISHED",
"device": {
"hwVersion": "HV3.0.2",
"swVersion": "SV2.2.2.230619_Beta_V2",
"deviceModel": "PM001",
"sn": 0000000000,
"configuration": "CV1.22.7.20"
},
"test": {
"state": "DONE",
"result": {
"detectionType": 1,
"detectionFlowNumber": 166,
"detectionResult": "INVALID",
"numberOfChannels": 7,
"startingChannel": 0,
"channelResults": [
"NEGATIVE",
"NEGATIVE",
"NEGATIVE",
"NEGATIVE",
"NEGATIVE",
"NEGATIVE",
"NEGATIVE"
],
"numberOfSubGroups": 2,
"subGroupResults": [
{ "result": "NEGATIVE", "name": "IC" },
{ "result": "INVALID", "name": "SARS-CoV-2" }
]
},
"data": {
"temperatureSamples": [
{ "time": "2025-06-30T16:10:13.802Z", "temp": 63.16767501831055 },
{ "time": "2025-06-30T16:10:15.872Z", "temp": 63.13431167602539 },
{ "time": "2025-06-30T16:10:17.851Z", "temp": 63.13431167602539 },
...
],
"samples": [
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 1,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 704
},
{
"sampleType": 1,
"sampleStreamNumber": 166,
"currentDataIndex": 7,
"totalNumberOfSamples": 8,
"startingChannel": 2,
"numberOfChannels": 1,
"samplingTime": 4508,
"samplingTemperature": 63.1,
"firstChannelResult": 896
},
...
]
}
}
}