Cellular
Cellular add-on: device registry, remote config, and outbound measurement webhooks.
List configuration profiles created in Tempivo (Integrations → Config profiles). Use each profile's slug with GET /devices/config-profiles/{slug} and PUT …/apply. Creating or editing profile definitions via API is not supported.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Response Body
application/json
curl -X GET "https://example.com/devices/config-profiles"{
"profiles": [
{
"slug": "weekday-low-temp",
"name": "Weekday low temperature",
"measurementPeriodBase": 3600,
"measurementPeriodFactor": 1,
"transmissionInterval": 21600
},
{
"slug": "weekday-alarms",
"name": "Weekday — low temperature alarm",
"measurementPeriodBase": 300,
"measurementPeriodFactor": 1,
"transmissionInterval": 21600,
"alarmRules": [
{
"slotNumbers": [
0
],
"condition": "LOW_THRESHOLD",
"alarmRuleType": "TEMPERATURE",
"threshold": 50,
"hysteresis": 2,
"action": "TRIGGER_TRANSMISSION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
},
{
"condition": "DISABLED",
"slotNumbers": [],
"action": "NO_ACTION"
}
],
"calendars": [
{
"type": "WEEK",
"enableRules": [
0
],
"days": [
1,
2,
3,
4,
5
],
"fromTime": 480,
"toTime": 1080,
"timezone": 60
},
{
"type": "DISABLED",
"enableRules": []
},
{
"type": "DISABLED",
"enableRules": []
},
{
"type": "DISABLED",
"enableRules": []
},
{
"type": "DISABLED",
"enableRules": []
},
{
"type": "DISABLED",
"enableRules": []
}
]
}
]
}Read a profile by slug (created in the Tempivo app). Use PUT …/apply to push it to devices.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Response Body
application/json
curl -X GET "https://example.com/devices/config-profiles/string"{
"profile": {
"slug": "weekday-low-temp",
"name": "Weekday low temperature",
"measurementPeriodBase": 3600,
"measurementPeriodFactor": 1,
"transmissionInterval": 21600
}
}Read pending configuration (after profile apply) and the latest configuration reported by the device. Use syncStatus to see whether profile settings have been applied: poll until pendingConfig is null and syncStatus is applied (or no_device_report if the device has not reported config yet).
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Device serial number
Response Body
application/json
curl -X GET "https://example.com/devices/string/config"{
"serialNumber": "SN001",
"assetId": "asset-123",
"assetName": "Hot water — Building A",
"pendingConfig": null,
"deviceConfig": {
"measurementPeriodBase": 3600,
"measurementPeriodFactor": 1,
"transmissionInterval": 21600
},
"deviceConfigReceivedAt": "2026-03-17T10:00:00.000Z",
"syncStatus": "applied"
}Merge the profile into pendingConfiguration for the given serial numbers or all active devices. Devices pick up changes on the next config poll.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Apply a profile to devices. Provide serialNumbers (non-empty) or applyToAll true, not both.
Response Body
application/json
curl -X PUT "https://example.com/devices/config-profiles/string/apply" \ -H "Content-Type: application/json" \ -d '{ "serialNumbers": [ "SN001", "SN002" ] }'{
"ok": true,
"profileSlug": "weekday-low-temp",
"appliedCount": 2,
"applied": [
"SN001",
"SN002"
]
}List devices in your organization. Paginate with cursor / nextCursor.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Query Parameters
Max items per page
Last asset's id from the previous page: the same value returned as nextCursor (pass verbatim).
Optional filter by sensor product line (alias: model-name).
Deprecated alias for model query param.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/assets"{
"items": [
{
"id": "asset-123",
"recType": "asset",
"name": "Unit 0042",
"serialNumber": "DEVICE-123456789012",
"status": "online",
"signalStrength": "good",
"batteryStatus": "ok",
"model": "TVO-THT",
"lastReadingAt": "2026-03-17T10:00:00.000Z"
}
],
"totalItems": 1,
"nextCursor": "asset-123"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}Register a device (unique serialNumber among active assets). For integrator accounts, serialNumber and optional name are enough.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Register a device in your org. Cellular / integrator: omit buildingId when the org has a default building; use waterType automatic and floor 0 for a flat device list. Full REST (property): set buildingId (and optionally spaceId or floor) for building/room placement.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/assets" \ -H "Content-Type: application/json" \ -d '{ "serialNumber": "DEVICE-123456789012", "name": "Unit 0042", "waterType": "automatic", "floor": 0, "model": "TVO-THT" }'{
"id": "string"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}Retrieve one device by asset ID. Same API key as config profiles.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Response Body
application/json
application/json
curl -X GET "https://example.com/assets/string"{
"id": "asset-123",
"recType": "asset",
"name": "Unit 0042",
"serialNumber": "DEVICE-123456789012",
"status": "online",
"signalStrength": "good",
"batteryStatus": "ok",
"model": "TVO-THT",
"lastReadingAt": "2026-03-17T10:00:00.000Z"
}{
"success": false,
"message": "Invalid or inactive API key"
}Remove a device from your org (soft-delete: status → archived, assignments cleared). It disappears from list/get; measurement history is kept. No public restore — contact support if needed. Same API key as config profiles.
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Response Body
application/json
application/json
curl -X DELETE "https://example.com/assets/string"{
"deleted": true
}{
"success": false,
"message": "Invalid or inactive API key"
}Replace the physical device for an asset: set a new serial number and append the previous one to replacement history. All existing data (history, config, alerts) is kept. Cellular API organizations may use their API key here without the API integrations add-on (same key as config profiles).
Authorization
ApiKeyAuth Bearer token with your API key. Example: Bearer sk_live_xxx
In: header
Path Parameters
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/assets/string/replace-hardware" \ -H "Content-Type: application/json" \ -d '{ "newSerialNumber": "DEVICE-987654321098" }'{
"success": true,
"serialNumber": "string"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}{
"success": false,
"message": "Invalid or inactive API key"
}How is this guide?