Webhooks overview
Get data the moment it happens. Our webhooks automatically push label reports to your endpoint as soon as they are activated or tapped. This enables instant, event-driven responses across your entire cold-chain infrastructure.
Setting up a webhook
In the Dashboard, go to SettingsWebhooks and click Add webhook.
Webhook settings
- Namerequired
- Only used for your own reference.
- Endpoint URLrequired
- Where deliveries are sent. Must be a public HTTPS endpoint that accepts POST requests.
- Eventsrequired
- Which events this webhook receives.
Testing webhooks
Use the Test webhook button to confirm your URL receives a delivery.
Custom headers
You can add custom headers such as an x-api-key to every webhook delivery to support your authentication or routing needs. Mark headers as secret to encrypt them, they will be write-only and hidden from view after saving. Toggle off the secret setting for non-sensitive data.
Events
There are currently two events available for webhooks.
- labelReport.created
- Sent once a label is activated and its report is created. The delivery carries the full report but won't contain datapoints yet.
- labelReport.updated
- Sent when an existing label report changes, for example when the label is tapped or updated otherwise.
Label report created labelReport.created
Sent once a label is activated and its report is created.
{
"data": {
"id": "00000000-0000-4000-8000-000000000003",
"mode": "unknown",
"type": "tempSense",
"user": {
"id": "00000000-0000-4000-8000-0000000000b1",
"email": "[email protected]",
"joined": "2026-02-18T08:49:24.374Z",
"created": "2026-02-18T08:49:24.374Z",
"updated": "2026-06-29T07:12:32.157Z",
"fullName": "Jane Doe",
"initials": "JD",
"lastName": "Doe",
"accountId": "00000000-0000-4000-8000-0000000000b1",
"firstName": "Jane",
"lastOnline": "2026-08-04T05:36:58.108Z",
"phoneNumber": "+31600000000",
"preferences": {
"language": "nl",
"timeZone": "Europe/Amsterdam",
"temperatureUnit": "celsius"
},
"profilePicture": null,
"lastSelectedUserRoleId": "00000000-0000-4000-8000-0000000000b2"
},
"alert": {
"level": -1,
"timestamp": 1785822054
},
"label": {
"uid": "00000000000003",
"name": null,
"type": "tempSense",
"sequenceCode": "TAPP-0000-0003",
"firmwareVersionInfo": {
"firmwareVersion": "0.31",
"firmwareApiVersion": "7.1"
},
"estimatedBatteryDaysLeft": 180
},
"status": "active",
"company": {
"id": "00000000-0000-4000-8000-000000000000",
"name": "Tapp",
"shortCode": "TAPP"
},
"created": "2026-08-04T05:40:54.594Z",
"hasFlag": false,
"updated": "2026-08-04T05:40:54.639Z",
"isArchived": false,
"labelPreset": null,
"senseConfig": {
"limits": {
"maxTemperature": 20,
"minTemperature": 0
},
"interval": 600,
"configTime": 1748502497,
"startDelay": 62503,
"runningTime": null
},
"alertsConfig": […],
"customFields": null,
"numberOfTaps": 0,
"labelReference": null,
"readAccessToken": "2222222222222222222222222222222222222222222222222222222222222222",
"dataIsIncomplete": false,
"minimalSenseData": null,
"trimmedSenseData": null,
"calculatedSenseData": null
},
"event": "labelReport.created",
"timestamp": "2026-08-04T05:40:54.883Z"
}
Label report updated labelReport.updated
Sent when an existing report changes. When a label is tapped, the event payload will also contain measurement data.
{
"data": {
"id": "00000000-0000-4000-8000-000000000003",
"mode": "unknown",
"type": "tempSense",
"alert": {
"level": 2,
"timestamp": 1785822105
},
"label": {
"uid": "00000000000003",
"name": null,
"type": "tempSense",
"sequenceCode": "TAPP-0000-0003",
"firmwareVersionInfo": {
"firmwareVersion": "0.31",
"firmwareApiVersion": "7.1"
}
},
"status": "active",
"company": {
"id": "00000000-0000-4000-8000-000000000000",
"name": "Tapp",
"shortCode": "TAPP"
},
"created": "2026-08-04T05:40:54.594Z",
"hasFlag": false,
"updated": "2026-08-04T05:41:45.158Z",
"isArchived": false,
"senseConfig": {
"limits": {
"maxTemperature": 20,
"minTemperature": 0
},
"interval": 600,
"configTime": 1748502497,
"startDelay": 62503,
"runningTime": null
},
"alertsConfig": […],
"customFields": null,
"numberOfTaps": 1,
"labelReference": null,
"readAccessToken": "2222222222222222222222222222222222222222222222222222222222222222",
"dataIsIncomplete": false,
"minimalSenseData": {
"alert": {
"level": 2,
"timestamp": 1785822105
},
"numberOfViolations": {
"all": 100,
"humidity": 0,
"temperature": 100
},
"flattenedDatapoints": [1, 1, 1, 1, 1],
"numberOfDatapointsRead": 100,
"numberOfDatapointsAvailable": 100,
"numberOfMeasurementsOccurred": 100
},
"trimmedSenseData": {
"alert": {
"level": 2,
"timestamp": 1785822105
},
"statuses": ["PRISTINE", "CONFIGURED", "STARTING", "LOGGING", "TEMPERATURE_TOO_HIGH"],
"startTime": 1748502500,
"datapoints": [
{ "timestamp": 1748502500, "temperature": 21 },
{ "timestamp": 1748503100, "temperature": 22 },
{ "timestamp": 1748503700, "temperature": 23 },
{ "timestamp": 1748561300, "temperature": 119 },
{ "timestamp": 1748561900, "temperature": 120 }
],
"startDelay": 62503,
"currentTime": 1785822105,
"elapsedTime": 60000,
"versionInfo": {
"apiVersion": "1.6",
"appVersion": "2.88 b88",
"firmwareVersion": "1.11",
"firmwareApiVersion": "8.2"
},
"isActiveTrim": false,
"analysedValues": {
"humidity": { "average": null },
"temperature": {
"average": 70.5,
"degreeHour": 1163.25,
"meanKineticTemperature": 92.59519452657253
}
},
"attainedValues": {
"maxTemperature": 20,
"minTemperature": 0
},
"preciseInterval": 600,
"preciseStartTime": 1748502500,
"numberOfViolations": {
"all": 100,
"humidity": 0,
"temperature": 100
},
"preciseElapsedTime": 37319605,
"measurementSnapshot": {
"humidity": null,
"timestamp": 1785822105,
"temperature": 26.5
},
"durationOfViolations": {
"all": 59400,
"humidity": 0,
"temperature": 59400
},
"elapsedTimeFromConfig": 122503,
"numberOfDatapointsRead": 100,
"numberOfDatapointsAvailable": 100,
"numberOfMeasurementsOccurred": 100,
"preciseElapsedTimeFromConfig": 37382108
},
"calculatedSenseData": {
"statuses": ["PRISTINE", "CONFIGURED", "STARTING", "LOGGING", "TEMPERATURE_TOO_HIGH"],
"startTime": 1748502500,
"datapoints": [
{ "timestamp": 1748502500, "temperature": 21 },
{ "timestamp": 1748503100, "temperature": 22 },
{ "timestamp": 1748503700, "temperature": 23 },
{ "timestamp": 1748561300, "temperature": 119 },
{ "timestamp": 1748561900, "temperature": 120 }
],
"startDelay": 62503,
"currentTime": 1785822105,
"elapsedTime": 60000,
"versionInfo": {
"apiVersion": "1.6",
"appVersion": "2.88 b88",
"firmwareVersion": "1.11",
"firmwareApiVersion": "8.2"
},
"analysedValues": {
"humidity": { "average": null },
"temperature": {
"average": 70.5,
"degreeHour": 1163.25,
"meanKineticTemperature": 92.59519452657253
}
},
"attainedValues": {
"maxTemperature": 20,
"minTemperature": 0
},
"preciseInterval": 600,
"preciseStartTime": 1748502500,
"numberOfViolations": {
"all": 100,
"humidity": 0,
"temperature": 100
},
"preciseElapsedTime": 37319605,
"measurementSnapshot": {
"humidity": null,
"timestamp": 1785822105,
"temperature": 26.5
},
"durationOfViolations": {
"all": 59400,
"humidity": 0,
"temperature": 59400
},
"elapsedTimeFromConfig": 122503,
"numberOfDatapointsRead": 100,
"numberOfDatapointsAvailable": 100,
"numberOfMeasurementsOccurred": 100,
"preciseElapsedTimeFromConfig": 37382108
}
},
"event": "labelReport.updated",
"timestamp": "2026-08-04T05:41:46.346Z"
}
What to expect from the payload
Fields vary depending on how the label is activated and the current state of the label report. For example labelPreset and customFields are only send along if they apply to your label. Parse defensively rather than assuming a field will be there.