Tempivo Help
REST API

Cellular

Cellular add-on: device registry, remote config, and outbound measurement webhooks.

REST API overview

GET
/devices/config-profiles

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
AuthorizationBearer <token>

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": []
        }
      ]
    }
  ]
}
Empty
GET
/devices/config-profiles/{slug}

Read a profile by slug (created in the Tempivo app). Use PUT …/apply to push it to devices.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

slug*string

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
  }
}

Empty
GET
/devices/{serial}/config

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
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

serial*string

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"
}

Empty
Empty
Empty
PUT
/devices/config-profiles/{slug}/apply

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
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

slug*string

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"
  ]
}
Empty
GET
/assets

List devices in your organization. Paginate with cursor / nextCursor.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Query Parameters

limit?integer

Max items per page

cursor?string

Last asset's id from the previous page: the same value returned as nextCursor (pass verbatim).

model?string

Optional filter by sensor product line (alias: model-name).

model-name?string

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"
}
POST
/assets

Register a device (unique serialNumber among active assets). For integrator accounts, serialNumber and optional name are enough.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

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"
}
GET
/assets/{assetId}

Retrieve one device by asset ID. Same API key as config profiles.

Authorization

ApiKeyAuth
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

assetId*string

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"
}
DELETE
/assets/{assetId}

Remove a device from your org (soft-delete: statusarchived, 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
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

assetId*string

Response Body

application/json

application/json

curl -X DELETE "https://example.com/assets/string"
{
  "deleted": true
}
{
  "success": false,
  "message": "Invalid or inactive API key"
}
POST
/assets/{assetId}/replace-hardware

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
AuthorizationBearer <token>

Bearer token with your API key. Example: Bearer sk_live_xxx

In: header

Path Parameters

assetId*string

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?