Download OpenAPI specification:
The Velavu REST API manages the assets, devices, sites, rules and event history in a Velavu organization. For questions or support, contact support@velavu.com.
Base URL. All paths are relative to https://api.velavu.com.
Omitted fields. Properties whose value is null, an empty list or an empty object are
left out of responses rather than returned as null. Read optional properties with a safe
accessor (for example obj.get("key") in Python). Fields marked optional in a schema may be
absent for this reason.
Timestamps are ISO 8601 strings in UTC, for example 2026-10-26T17:03:22+00:00.
Coordinates are [longitude, latitude], matching GeoJSON.
IDs. Most objects have a short random ID such as HQojZMGKuF. Device IDs are the 5
character IDs printed on the device (00000, A0363). User IDs are email addresses.
Empty responses. Operations that do not return an object (deletes and device commands)
respond 200 with the JSON body null.
Every request needs an Authorization: Bearer <token> header. The token is either:
POST /tokens, orA request that is missing a valid token is rejected with 401. A valid token without the
permission an operation needs is rejected with 403.
Every user and API token has a role. A role grants a fixed
set of fine-grained permissions such as assets:write or devices:control, and each
operation in this reference lists the permission it requires. Roles are cumulative: each role
has every permission of the role to its left.
| Role | Description |
|---|---|
VIEWER |
Read-only access to most resources. Can only change their own user settings. |
OPERATOR |
Viewer, plus create/delete assets, delete alerts and control devices. |
SITE_MANAGER |
Operator, plus manage sites, geofences, rules, integrations and devices, and read DFU/OTAP images. |
ADMIN |
Every permission, including organization, billing, user and API token management. |
| Permission | VIEWER |
OPERATOR |
SITE_MANAGER |
ADMIN |
|---|---|---|---|---|
alerts:delete |
✓ | ✓ | ✓ | |
alerts:read |
✓ | ✓ | ✓ | ✓ |
api-tokens:delete |
✓ | |||
api-tokens:read |
✓ | |||
api-tokens:write |
✓ | |||
assets:delete |
✓ | ✓ | ✓ | |
assets:read |
✓ | ✓ | ✓ | ✓ |
assets:write |
✓ | ✓ | ✓ | |
backends:delete |
✓ | |||
backends:read |
✓ | ✓ | ✓ | ✓ |
backends:write |
✓ | |||
billing:read |
✓ | |||
devices:control |
✓ | ✓ | ✓ | |
devices:delete |
✓ | |||
devices:manage |
✓ | ✓ | ||
devices:read |
✓ | ✓ | ✓ | ✓ |
devices:write |
✓ | ✓ | ||
dfu:read |
✓ | ✓ | ||
dfu:write |
✓ | ✓ | ||
events:delete |
✓ | |||
events:read |
✓ | ✓ | ✓ | ✓ |
geofences:delete |
✓ | ✓ | ||
geofences:read |
✓ | ✓ | ✓ | ✓ |
geofences:write |
✓ | ✓ | ||
integrations:read |
✓ | ✓ | ✓ | ✓ |
integrations:write |
✓ | ✓ | ||
inventories:delete |
✓ | ✓ | ||
inventories:manage |
✓ | ✓ | ✓ | |
inventories:read |
✓ | ✓ | ✓ | ✓ |
inventories:write |
✓ | ✓ | ||
mqtt:authorize |
✓ | ✓ | ✓ | ✓ |
mqtt:delete |
✓ | |||
mqtt:read |
✓ | ✓ | ✓ | ✓ |
mqtt:write |
✓ | |||
organization:read |
✓ | ✓ | ✓ | ✓ |
organization:write |
✓ | |||
otap:read |
✓ | |||
otap:write |
✓ | |||
rules:delete |
✓ | ✓ | ||
rules:read |
✓ | ✓ | ||
rules:write |
✓ | ✓ | ||
rules:write-config |
✓ | |||
sites:delete |
✓ | ✓ | ||
sites:manage |
✓ | ✓ | ||
sites:read |
✓ | ✓ | ✓ | ✓ |
sites:write |
✓ | ✓ | ||
users:delete |
✓ | ✓ | ||
users:read |
✓ | ✓ | ✓ | ✓ |
users:write |
✓ | ✓ | ||
users:write-self |
✓ | ✓ | ✓ | ✓ |
vitalguard:respond |
✓ | ✓ | ✓ |
List operations that can return many objects are paginated. They accept limit and
continuation_token query parameters. When more results are available the response carries
two headers:
| Header | Description |
|---|---|
X-Continuation-Token |
Pass this as continuation_token to fetch the next page. |
X-Next-Link |
The full URL of the next page. |
When neither header is present you have reached the last page. limit defaults to and may not
exceed 250 for object lists, and 1000 for event lists. A larger limit is rejected
with 400. Events are always returned newest first.
Errors are returned as a JSON object with a message, and sometimes a machine-readable
reason:
{"message": "Device by the key {'customer_id': 'swJd', 'id': 'X0000'} does not exist."}
| Status | Meaning |
|---|---|
400 |
The request was invalid. Validation failures from query or body parsing return the validator's message. |
401 |
Missing or invalid token. |
403 |
The token lacks the required permission, or the object belongs to another organization. |
404 |
The object does not exist. |
500 |
Unexpected server error. |
Clients that want real-time updates instead of polling can subscribe to Velavu's MQTT broker
at iot.velavu.com:8883. Create a client certificate with
POST /eventstream/certificates and use the
Amazon Root CA 1 for TLS.
Clients may only subscribe to topics under events/<customer_id>/, where customer_id is
returned by GET /organization. Publishing is not
permitted. Every database change is published to:
events/<customer_id>/<table>/<object_id>/<operation>
table is one of events, assets, devices, sites, geofences or rules; operation
is created, updated or deleted. The payload is the full object as JSON, in the same shape
as the REST API returns it. For example, a heartbeat from device Fw34K publishes the updated
device to events/VLV1/devices/Fw34K/updated.
Assets are the people, vehicles and equipment being tracked. An asset is located through the device paired to it.
Required permission: assets:read (role VIEWER or higher)
| name | string Only assets whose name starts with this value (case-sensitive). |
| category | string (AssetCategory) Enum: "VEHICLE" "EQUIPMENT" "PERSON" |
| group | string Only assets in this group (exact match). |
| paired | boolean
|
| online | boolean Filter by the paired device's online status. |
| only_registered | boolean With |
| include_profile_images | boolean Default: false Include |
| limit | integer [ 1 .. 250 ] Default: 250 Maximum number of objects to return. |
| continuation_token | string The |
[- {
- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}
]Required permission: assets:write (role OPERATOR or higher)
| name required | string |
| category required | string (AssetCategory) Enum: "VEHICLE" "EQUIPMENT" "PERSON" |
| group required | string Free-form group within the category, for example |
| notes | string |
| device_id | string Pair this device with the new asset. The device must not already be paired. |
{- "name": "Sarah Davis",
- "category": "PERSON",
- "group": "Doctor",
- "device_id": "00000"
}{- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}Required permission: assets:read (role VIEWER or higher)
| asset_id required | string Example: HQojZMGKuF |
{- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}Required permission: assets:write (role OPERATOR or higher)
Only the fields you send are changed. Send device_id to pair a device; use unpair to remove one.
| asset_id required | string Example: HQojZMGKuF |
| name | string |
| category | string (AssetCategory) Enum: "VEHICLE" "EQUIPMENT" "PERSON" |
| group | string |
| notes | string |
| device_id | string |
{- "notes": "Night shift"
}{- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}Required permission: assets:write (role OPERATOR or higher)
| asset_id required | string Example: HQojZMGKuF |
{- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}Required permission: assets:write (role OPERATOR or higher)
| asset_id required | string Example: HQojZMGKuF |
| image required | string^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-... The image file, base64-encoded. |
{- "image": null
}{- "id": "HQojZMGKuF",
- "category": "PERSON",
- "group": "Doctor",
- "name": "Sarah Davis",
- "device_id": "00000",
- "online": true
}Tags, anchors and gateways in the organization.
A device's config and state objects depend on its hardware type. Pick a hardware type
in the Device schema below to see the fields that type's firmware reports.
Required permission: devices:read (role VIEWER or higher)
| id | string Only devices whose ID starts with this value. |
| category | string (DeviceCategory) Enum: "TAG" "ANCHOR" |
| hardware | string (DeviceHardware) Enum: "argo" "meridian" "generic" "panicbutton" "juno" "aries" Firmware family running on the device. Determines the shape of |
| model | string Example: model=Pavo HD Only devices of this model (exact match). |
| site_id | string Only devices inside this site. Results are not paginated when filtering by site. |
| geofence_id | string Only devices inside this geofence. |
| bbox | string Example: bbox=-79.37,43.67,-79.36,43.69 Only devices inside this bounding box, as |
| paired | boolean
|
| online | boolean |
| only_registered | boolean With |
| config_confirmed | boolean
|
| limit | integer [ 1 .. 250 ] Default: 250 Maximum number of objects to return. |
| continuation_token | string The |
[- {
- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}
]Required permission: devices:write (role SITE_MANAGER or higher)
Adds a device to your organization.
GET /available), it is registered and only
id is needed.serial_code, category and model.
Use this for third-party devices.| id required | string Device ID, as printed on the device. | ||||||
| serial_code | string Required when creating a device that is not a registered Velavu device. | ||||||
| category | string (DeviceCategory) Enum: "TAG" "ANCHOR" Required when creating. When registering, defaults to the device's current category. Must be one of the model's | ||||||
| model | string Device model name. Required when creating. | ||||||
object (FixedLocation) Fixed location for an anchor. | |||||||
| |||||||
| notes | string | ||||||
{- "id": "A0363",
- "category": "ANCHOR",
- "location": {
- "coordinates": [
- -79.3672040337544,
- 43.67960821414513
], - "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70"
}
}{- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}Required permission: devices:read (role VIEWER or higher)
| device_id required | string Example: 00000 |
{- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}Required permission: devices:write (role SITE_MANAGER or higher)
Registers an unregistered Velavu device with this ID. Equivalent to POST /devices with only id.
| device_id required | string Example: 00000 |
object (FixedLocation) | |||||||
| |||||||
| notes | string | ||||||
| category | string (DeviceCategory) Enum: "TAG" "ANCHOR" | ||||||
{- "category": "TAG",
- "notes": "Spare"
}{- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}Required permission: devices:write (role SITE_MANAGER or higher)
Only the fields you send are changed.
location sets a fixed location (normally for anchors). The device is placed in the
site containing the coordinates; floor_id must be a floor of that site.category must be one of the model's categories. A device paired to an asset
cannot become an ANCHOR.state sends a state change to the device. Only fields the device already reports
can be set, and the change is only sent if the device is online.dfu_channel is only accepted for argo devices.config and asset_id are accepted by the request schema but currently ignored.
Change configuration with a rule and pair devices from the
asset.
| device_id required | string Example: 00000 |
object (FixedLocation) | |||||||
| |||||||
| asset_id | string Deprecated Ignored. Pair from the asset instead. | ||||||
| notes | string | ||||||
object Deprecated Ignored. Use a rule to change configuration. | |||||||
| |||||||
object State fields to set on the device. | |||||||
| |||||||
| category | string (DeviceCategory) Enum: "TAG" "ANCHOR" | ||||||
| dfu_channel | string (FwChannel) Enum: "STABLE" "BETA" "ALPHA" Automatic firmware update channel. | ||||||
{- "notes": "Mounted above door 2",
- "location": {
- "coordinates": [
- -79.3672040337544,
- 43.67960821414513
], - "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}
}{- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}Required permission: devices:delete (role ADMIN or higher)
Removes the device from your organization. The device is unpaired from its asset, removed from any Wirepas backend and sent a factory reset. Velavu devices become available to register again. A cellular device's SIM is deactivated one day later.
| device_id required | string Example: 00000 |
nullRequired permission: devices:read (role VIEWER or higher)
Finds a device by ID or serial code and tells you whether it is already registered to your organization. Pass id or serial_code.
| id | string Example: id=00000 |
| serial_code | string |
{- "device": {
- "id": "V0000",
- "serial_code": "sw:Jd:00:00:00:1F",
- "category": "TAG",
- "hardware": "argo",
- "model": "Vesta",
- "online": true,
- "heartbeat": "2026-10-26T11:01:45+00:00",
- "location": {
- "coordinates": [
- -79.3671253821918,
- 43.68024515088513
], - "timestamp": "2026-09-24T15:55:53+00:00",
- "location_type": "FIXED",
- "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "locked": true
}, - "config": {
- "heartbeat_rate_s": 1800,
- "dfu_auto_update": true,
- "disable_offline_sink": true,
- "positioning": {
- "dynamic_mode": true,
- "fixed_rate_s": 0,
- "dynamic_rate_s": 30
}, - "imu": {
- "motion_detection": false,
- "motion_cooldown_s": 15
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "role": "SINK",
- "gateway_mode": "VLV_BACKEND",
- "otap_mode": "OTAP_DISABLED",
- "low_latency_mode": true,
- "routing_info": false
}
}, - "config_confirmed": true,
- "state": {
- "app_version": "velavu-gateway_2.12.2_argo-revB_OPEN",
- "power": {
- "battery_level": 100,
- "battery_charging": false,
- "usb_power": true
}, - "vehicle": {
- "driving": false
}, - "cell": {
- "imei": "351358810000000",
- "iccid": "89302720000000000000",
- "reg_status": "REGISTERED_HOME",
- "operator_name": "Example Mobile",
- "apn": "example.apn",
- "fw_version": "mfw_nrf9160_1.3.5",
- "band": 13,
- "rsrp": -98,
- "net_mode": "LTEM"
}, - "gnss": {
- "valid_fix": false,
- "sats_in_view": 0,
- "snr": 0
}, - "wirepas": {
- "stored_otap_crc": 4139,
- "processed_otap_crc": 4139,
- "stack_version": 84542721
}
}, - "site_id": "qs2oTBdeaj"
}, - "registered": true
}Required permission: devices:manage (role SITE_MANAGER or higher)
Sends a reboot command and marks the device offline until its next heartbeat. The device must be online to receive it.
| device_id required | string Example: 00000 |
nullRequired permission: devices:manage (role SITE_MANAGER or higher)
Sends a shutdown command and marks the device offline. Only argo devices support this; other hardware returns 400.
| device_id required | string Example: 00000 |
nullRequired permission: devices:control (role OPERATOR or higher)
Asks the device to report its position now. The new position arrives as a LOCATION event. The device must be online.
| device_id required | string Example: 00000 |
nullRequired permission: devices:control (role OPERATOR or higher)
Asks the device to scan for nearby BLE beacons. Results arrive asynchronously as a
BLE_BEACON_SCAN event about scan_duration seconds later. Supported on argo,
meridian, generic and aries hardware. The device must be online.
Unlike the site scan, this does not create a
BLE_SCAN_REQUEST event.
| device_id required | string Example: 00000 |
| filters | Array of strings (BleScanFilter) Items Enum: "Minew V1" "Minew V2" "Eddystone" "iBeacon" Beacon formats to report. |
| min_rssi | integer Beacons weaker than this (dBm) are ignored. |
| scan_duration | integer > 0 Scan length in seconds. |
{- "filters": [
- "Eddystone"
], - "scan_duration": 30,
- "min_rssi": -71
}nullRequired permission: devices:control (role OPERATOR or higher)
Makes the device flash its LED or sound its buzzer so it can be found. The indicator
used depends on the model (indicator on the device model).
Supported on argo, meridian, generic and panicbutton hardware. The
device must be online.
| device_id required | string Example: 00000 |
| timeout_s | integer > 0 How long to keep indicating, in seconds. |
| on_time_ms | integer > 0 On time of each blink, in milliseconds. |
| off_time_ms | integer > 0 Off time of each blink, in milliseconds. |
{- "timeout_s": 30,
- "on_time_ms": 500,
- "off_time_ms": 500
}nullTime-series history: locations, sensor readings, boundary crossings, device lifecycle and
more. The shape of data depends on category; pick a category in the Event schema to
see it.
Required permission: events:read (role VIEWER or higher)
Events of one category across the organization, newest first.
| event_category required | string (EventCategory) Enum: "LOCATION" "ENVIRONMENT" "BATTERY_LEVEL" "LOW_BATTERY" "DRIVING_ROUTE" "DRIVING_EVT" "IMU_SHOCK" "IMU_MOTION" "DEVICE_BOOT" "DEVICE_POWER_DOWN" "DEVICE_ERROR" "DEVICE_CONNECT" "DEVICE_DISCONNECT" "DEVICE_PROVISION" "PROVISION_REQUEST" "SITE_ENTERED" "SITE_EXITED" "GEOFENCE_ENTERED" "GEOFENCE_EXITED" "INVENTORY_ADDED" "INVENTORY_REMOVED" "WEARABLE_ALERT" "CUSTOM_EVENT" "DFU_REQUEST" "OTAP_REQUEST" "BLE_SCAN_REQUEST" "BLE_BEACON_SCAN" "MESH_BEACON_SCAN" "WIFI_BEACON_SCAN" "ALERT" Event category to return. Unknown categories return an empty list. |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
| limit | integer [ 1 .. 1000 ] Default: 1000 Maximum number of events to return. |
| continuation_token | string The |
[- {
- "id": "N8yxl5rx4j",
- "category": "LOCATION",
- "timestamp": "2026-10-26T17:13:57+00:00",
- "asset_id": "ogJoterwmx",
- "device_id": "00487",
- "data": {
- "accuracy": 3.7,
- "coordinates": [
- -79.367371,
- 43.680771
], - "floor_id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "location_type": "MESH"
}
}
]Required permission: events:delete (role ADMIN or higher)
Deletes every event of this category in the time range. With no range, deletes all of them.
| event_category required | string (EventCategory) Enum: "LOCATION" "ENVIRONMENT" "BATTERY_LEVEL" "LOW_BATTERY" "DRIVING_ROUTE" "DRIVING_EVT" "IMU_SHOCK" "IMU_MOTION" "DEVICE_BOOT" "DEVICE_POWER_DOWN" "DEVICE_ERROR" "DEVICE_CONNECT" "DEVICE_DISCONNECT" "DEVICE_PROVISION" "PROVISION_REQUEST" "SITE_ENTERED" "SITE_EXITED" "GEOFENCE_ENTERED" "GEOFENCE_EXITED" "INVENTORY_ADDED" "INVENTORY_REMOVED" "WEARABLE_ALERT" "CUSTOM_EVENT" "DFU_REQUEST" "OTAP_REQUEST" "BLE_SCAN_REQUEST" "BLE_BEACON_SCAN" "MESH_BEACON_SCAN" "WIFI_BEACON_SCAN" "ALERT" Event category to return. Unknown categories return an empty list. |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
nullRequired permission: events:read (role VIEWER or higher)
For example GET /events/LOCATION/asset/HQojZMGKuF returns an asset's location history.
| event_category required | string (EventCategory) Enum: "LOCATION" "ENVIRONMENT" "BATTERY_LEVEL" "LOW_BATTERY" "DRIVING_ROUTE" "DRIVING_EVT" "IMU_SHOCK" "IMU_MOTION" "DEVICE_BOOT" "DEVICE_POWER_DOWN" "DEVICE_ERROR" "DEVICE_CONNECT" "DEVICE_DISCONNECT" "DEVICE_PROVISION" "PROVISION_REQUEST" "SITE_ENTERED" "SITE_EXITED" "GEOFENCE_ENTERED" "GEOFENCE_EXITED" "INVENTORY_ADDED" "INVENTORY_REMOVED" "WEARABLE_ALERT" "CUSTOM_EVENT" "DFU_REQUEST" "OTAP_REQUEST" "BLE_SCAN_REQUEST" "BLE_BEACON_SCAN" "MESH_BEACON_SCAN" "WIFI_BEACON_SCAN" "ALERT" Event category to return. Unknown categories return an empty list. |
| resource required | string Enum: "asset" "device" "site" "geofence" Kind of object to filter by. |
| resource_id required | string Example: HQojZMGKuF ID of the asset, device, site or geofence. |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
| limit | integer [ 1 .. 1000 ] Default: 1000 Maximum number of events to return. |
| continuation_token | string The |
[- {
- "id": "GmS7fAYAnr",
- "category": "LOCATION",
- "timestamp": "2026-10-26T17:03:22+00:00",
- "asset_id": "HQojZMGKuF",
- "device_id": "00000",
- "data": {
- "accuracy": 4.6,
- "coordinates": [
- -79.367355,
- 43.679585
], - "floor_id": "qs2oTBdeajf_d64f74200b23871c",
- "location_type": "MESH"
}
}
]Required permission: events:delete (role ADMIN or higher)
| event_category required | string (EventCategory) Enum: "LOCATION" "ENVIRONMENT" "BATTERY_LEVEL" "LOW_BATTERY" "DRIVING_ROUTE" "DRIVING_EVT" "IMU_SHOCK" "IMU_MOTION" "DEVICE_BOOT" "DEVICE_POWER_DOWN" "DEVICE_ERROR" "DEVICE_CONNECT" "DEVICE_DISCONNECT" "DEVICE_PROVISION" "PROVISION_REQUEST" "SITE_ENTERED" "SITE_EXITED" "GEOFENCE_ENTERED" "GEOFENCE_EXITED" "INVENTORY_ADDED" "INVENTORY_REMOVED" "WEARABLE_ALERT" "CUSTOM_EVENT" "DFU_REQUEST" "OTAP_REQUEST" "BLE_SCAN_REQUEST" "BLE_BEACON_SCAN" "MESH_BEACON_SCAN" "WIFI_BEACON_SCAN" "ALERT" Event category to return. Unknown categories return an empty list. |
| resource required | string Enum: "asset" "device" "site" "geofence" Kind of object to filter by. |
| resource_id required | string Example: HQojZMGKuF ID of the asset, device, site or geofence. |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
nullRequired permission: events:delete (role ADMIN or higher)
| event_category required | string (EventCategory) Enum: "LOCATION" "ENVIRONMENT" "BATTERY_LEVEL" "LOW_BATTERY" "DRIVING_ROUTE" "DRIVING_EVT" "IMU_SHOCK" "IMU_MOTION" "DEVICE_BOOT" "DEVICE_POWER_DOWN" "DEVICE_ERROR" "DEVICE_CONNECT" "DEVICE_DISCONNECT" "DEVICE_PROVISION" "PROVISION_REQUEST" "SITE_ENTERED" "SITE_EXITED" "GEOFENCE_ENTERED" "GEOFENCE_EXITED" "INVENTORY_ADDED" "INVENTORY_REMOVED" "WEARABLE_ALERT" "CUSTOM_EVENT" "DFU_REQUEST" "OTAP_REQUEST" "BLE_SCAN_REQUEST" "BLE_BEACON_SCAN" "MESH_BEACON_SCAN" "WIFI_BEACON_SCAN" "ALERT" Event category to return. Unknown categories return an empty list. |
| event_id required | string |
nullRequired permission: events:read (role VIEWER or higher)
A combined timeline of the most important event categories: IMU_SHOCK, IMU_MOTION,
DEVICE_CONNECT, DEVICE_DISCONNECT, LOW_BATTERY, SITE_ENTERED, SITE_EXITED,
GEOFENCE_ENTERED, GEOFENCE_EXITED and CUSTOM_EVENT. At most 50 events per category are
returned, sorted newest first. Not paginated.
| asset_id required | string Example: HQojZMGKuF |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
[- {
- "id": "GmS7fAYAnr",
- "category": "LOCATION",
- "timestamp": "2026-10-26T17:03:22+00:00",
- "asset_id": "HQojZMGKuF",
- "device_id": "00000",
- "data": {
- "accuracy": 4.6,
- "coordinates": [
- -79.367355,
- 43.679585
], - "floor_id": "qs2oTBdeajf_d64f74200b23871c",
- "location_type": "MESH"
}
}
]Required permission: events:read (role VIEWER or higher)
A combined timeline of the most important event categories: IMU_SHOCK, IMU_MOTION,
DEVICE_CONNECT, DEVICE_DISCONNECT, LOW_BATTERY, SITE_ENTERED, SITE_EXITED,
GEOFENCE_ENTERED, GEOFENCE_EXITED and CUSTOM_EVENT. At most 50 events per category are
returned, sorted newest first. Not paginated.
| device_id required | string Example: 00000 |
| since | string <date-time> Example: since=2026-10-01T00:00:00+00:00 Only return events at or after this time (ISO 8601). |
| until | string <date-time> Only return events at or before this time (ISO 8601). |
[- {
- "id": "GmS7fAYAnr",
- "category": "LOCATION",
- "timestamp": "2026-10-26T17:03:22+00:00",
- "asset_id": "HQojZMGKuF",
- "device_id": "00000",
- "data": {
- "accuracy": 4.6,
- "coordinates": [
- -79.367355,
- 43.679585
], - "floor_id": "qs2oTBdeajf_d64f74200b23871c",
- "location_type": "MESH"
}
}
]Required permission: alerts:read (role VIEWER or higher)
| event_categories | string Example: event_categories=WEARABLE_ALERT,LOW_BATTERY Comma-separated event categories. Only alerts raised by these categories are returned. |
| limit | integer [ 1 .. 250 ] Default: 250 Maximum number of objects to return. |
| continuation_token | string The |
[- {
- "id": "Jx81mQe0aB",
- "category": "ALERT",
- "event_category": "WEARABLE_ALERT",
- "timestamp": "2026-10-24T14:02:11+00:00",
- "device_id": "00000",
- "data": {
- "flags": 1
}, - "device": {
- "id": "00000",
- "model": "Mokosmart B5",
- "category": "TAG",
- "serial_code": "sw:Jd:00:00:00:00"
}, - "asset": {
- "id": "HQojZMGKuF",
- "name": "Sarah Davis",
- "group": "Doctor",
- "category": "PERSON"
}
}
]Required permission: alerts:delete (role OPERATOR or higher)
Deletes all alerts, or only those raised by the given categories.
| event_categories | string Comma-separated event categories. |
nullRequired permission: sites:read (role VIEWER or higher)
All sites, sorted by name. Not paginated.
| include_details | boolean Default: true Set to |
[- {
- "id": "qs2oTBdeaj",
- "name": "Hospital Demo",
- "online": true,
- "coordinates": [
- -79.367186,
- 43.680116
], - "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.36749126003457,
- 43.67903893937554
], - [
- -79.36767033464446,
- 43.67905084758134
], - [
- -79.36812032263101,
- 43.67928076485148
], - [
- -79.36749126003457,
- 43.67903893937554
]
]
]
}, - "boundary_factor": 1.5,
- "floors": [
- {
- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": { },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- -79.3679344269218,
- 43.679443684567744
], - [
- -79.36793000262506,
- 43.67947759554212
]
]
}
}
]
}
}
}
]
}
]Required permission: sites:write (role SITE_MANAGER or higher)
Creates a site with no floors. Add floors with POST /sites/{site_id}/floors; the boundary is computed from their walls.
| name required | string |
| coordinates required | Array of numbers = 2 items Site location as |
{- "name": "Hospital Demo",
- "coordinates": [
- -79.367186,
- 43.680116
]
}{- "id": "qs2oTBdeaj",
- "name": "Hospital Demo",
- "online": true,
- "coordinates": [
- -79.367186,
- 43.680116
], - "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.36749126003457,
- 43.67903893937554
], - [
- -79.36767033464446,
- 43.67905084758134
], - [
- -79.36812032263101,
- 43.67928076485148
], - [
- -79.36749126003457,
- 43.67903893937554
]
]
]
}, - "boundary_factor": 1.5,
- "floors": [
- {
- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": { },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- -79.3679344269218,
- 43.679443684567744
], - [
- -79.36793000262506,
- 43.67947759554212
]
]
}
}
]
}
}
}
]
}Required permission: sites:read (role VIEWER or higher)
| site_id required | string Example: qs2oTBdeaj |
{- "id": "qs2oTBdeaj",
- "name": "Hospital Demo",
- "online": true,
- "coordinates": [
- -79.367186,
- 43.680116
], - "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.36749126003457,
- 43.67903893937554
], - [
- -79.36767033464446,
- 43.67905084758134
], - [
- -79.36812032263101,
- 43.67928076485148
], - [
- -79.36749126003457,
- 43.67903893937554
]
]
]
}, - "boundary_factor": 1.5,
- "floors": [
- {
- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": { },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- -79.3679344269218,
- 43.679443684567744
], - [
- -79.36793000262506,
- 43.67947759554212
]
]
}
}
]
}
}
}
]
}Required permission: sites:write (role SITE_MANAGER or higher)
| site_id required | string Example: qs2oTBdeaj |
| name | string |
| coordinates | Array of numbers = 2 items |
| boundary_factor | number How far the boundary extends beyond the floor walls. |
{- "boundary_factor": 2
}{- "id": "qs2oTBdeaj",
- "name": "Hospital Demo",
- "online": true,
- "coordinates": [
- -79.367186,
- 43.680116
], - "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.36749126003457,
- 43.67903893937554
], - [
- -79.36767033464446,
- 43.67905084758134
], - [
- -79.36812032263101,
- 43.67928076485148
], - [
- -79.36749126003457,
- 43.67903893937554
]
]
]
}, - "boundary_factor": 1.5,
- "floors": [
- {
- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": { },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- -79.3679344269218,
- 43.679443684567744
], - [
- -79.36793000262506,
- 43.67947759554212
]
]
}
}
]
}
}
}
]
}Required permission: sites:write (role SITE_MANAGER or higher)
| site_id required | string Example: qs2oTBdeaj |
| name required | string | ||
| level required | integer Floor number. | ||
required | object
| ||
| |||
object Floor plan image placement (see | |||
| |||
| img_upload | string^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-... Floor plan image file, base64-encoded. | ||
{- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": {
- "type": "FeatureCollection",
- "features": [
- {
- "type": "Feature",
- "properties": { },
- "geometry": {
- "type": "LineString",
- "coordinates": [
- [
- -79.3679344269218,
- 43.679443684567744
], - [
- -79.36793000262506,
- 43.67947759554212
]
]
}
}
]
}
}
}{- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": { }
}, - "img": {
- "filename": "string",
- "width": 0,
- "height": 0,
- "center": [
- -79.367355,
- 43.679585
], - "coordinates": [
- [
- -79.367355,
- 43.679585
]
], - "scale": 0,
- "rotation": 0,
- "opacity": 0
}
}Required permission: sites:write (role SITE_MANAGER or higher)
| site_id required | string Example: qs2oTBdeaj |
| floor_id required | string Example: qs2oTBdeajf_13bb5816ec8a9b70 |
| name | string | ||
| level | integer | ||
object | |||
| |||
object | |||
| |||
| img_upload | string^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-... | ||
{- "name": "Ground floor"
}{- "id": "qs2oTBdeajf_13bb5816ec8a9b70",
- "name": "Level 1",
- "level": 0,
- "geometry": {
- "walls": { }
}, - "img": {
- "filename": "string",
- "width": 0,
- "height": 0,
- "center": [
- -79.367355,
- 43.679585
], - "coordinates": [
- [
- -79.367355,
- 43.679585
]
], - "scale": 0,
- "rotation": 0,
- "opacity": 0
}
}Required permission: sites:write (role SITE_MANAGER or higher)
Send the image file as the raw request body with a binary content type such as
image/png. Requests whose body API Gateway does not base64-encode (text content types)
are rejected with 400. Fetch the site to get the new img.url.
| site_id required | string Example: qs2oTBdeaj |
| floor_id required | string Example: qs2oTBdeajf_13bb5816ec8a9b70 |
nullRequired permission: sites:write (role SITE_MANAGER or higher)
Keeps every mesh device in the site on this OTAP image. Velavu creates a managed rule that re-sends the image to gateways whose mesh is not on it.
| site_id required | string Example: qs2oTBdeaj |
| name required | string OTAP image name from |
{- "name": "velavu-52833_legacy_20261021_103118.otap"
}{- "name": "string",
- "crc": 0,
- "rule_id": "string"
}Required permission: none is mapped for this route, so requests are currently rejected with 403.
Broadcasts a position request through every gateway in the site to devices of the given hardware type.
| site_id required | string Example: qs2oTBdeaj |
| hardware required | string Hardware type to ask, for example |
{- "hardware": "panicbutton"
}nullRequired permission: sites:manage (role SITE_MANAGER or higher)
Asks every online BLE-capable scanner in the site to scan. Each scanner's results arrive as a
BLE_BEACON_SCAN event; the returned BLE_SCAN_REQUEST event tracks how many scanners
have responded and becomes COMPLETE when all have, or after scan_timeout seconds.
| site_id required | string Example: qs2oTBdeaj |
| filters | Array of strings (BleScanFilter) Items Enum: "Minew V1" "Minew V2" "Eddystone" "iBeacon" |
| min_rssi | integer |
| scan_duration | integer > 0 |
| scan_timeout | integer > 0 Seconds to wait for all scanners before completing the request. |
{- "filters": [
- "Eddystone"
], - "scan_duration": 30,
- "scan_timeout": 60,
- "min_rssi": -71
}{- "id": "Hc7nR2uQ9x",
- "category": "BLE_SCAN_REQUEST",
- "timestamp": "2026-10-26T15:00:00+00:00",
- "site_id": "qs2oTBdeaj",
- "data": {
- "status": "STARTED",
- "expected_response_count": 3,
- "pending_response_count": 3,
- "scan_duration": 30,
- "scan_timeout": 60,
- "min_rssi": -71,
- "filters": [
- "Eddystone"
]
}
}Required permission: geofences:read (role VIEWER or higher)
Not paginated.
[- {
- "id": "string",
- "name": "string",
- "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.367355,
- 43.679585
]
]
]
}, - "center": [
- -79.367355,
- 43.679585
]
}
]Required permission: geofences:write (role SITE_MANAGER or higher)
| name required | string | ||
required | object GeoJSON | ||
| |||
{- "name": "Loading dock",
- "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.3681,
- 43.6801
], - [
- -79.3676,
- 43.6801
], - [
- -79.3676,
- 43.6798
], - [
- -79.3681,
- 43.6798
], - [
- -79.3681,
- 43.6801
]
]
]
}
}{- "id": "string",
- "name": "string",
- "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.367355,
- 43.679585
]
]
]
}, - "center": [
- -79.367355,
- 43.679585
]
}Required permission: geofences:read (role VIEWER or higher)
| geofence_id required | string |
{- "id": "string",
- "name": "string",
- "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.367355,
- 43.679585
]
]
]
}, - "center": [
- -79.367355,
- 43.679585
]
}Required permission: geofences:write (role SITE_MANAGER or higher)
| geofence_id required | string |
| name | string | ||
object | |||
| |||
{- "name": "string",
- "boundary": { }
}{- "id": "string",
- "name": "string",
- "boundary": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- -79.367355,
- 43.679585
]
]
]
}, - "center": [
- -79.367355,
- 43.679585
]
}Firmware updates for cellular gateways and trackers (argo hardware), downloaded directly by the device.
Required permission: dfu:read (role SITE_MANAGER or higher)
All DFU_REQUEST events in the organization, newest first.
[- {
- "id": "Qm2xYv8Lr1",
- "category": "DFU_REQUEST",
- "timestamp": "2026-10-21T15:02:44+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-gateway_2.12.2_argo-revB_OPEN.bin",
- "status": "COMPLETE"
}
}
]Required permission: dfu:read (role SITE_MANAGER or higher)
| device_id required | string Example: 00000 |
[- {
- "id": "Qm2xYv8Lr1",
- "category": "DFU_REQUEST",
- "timestamp": "2026-10-21T15:02:44+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-gateway_2.12.2_argo-revB_OPEN.bin",
- "status": "COMPLETE"
}
}
]Required permission: dfu:write (role SITE_MANAGER or higher)
Sends a firmware update to an argo device. name must be one of the images returned by
GET /dfu/device/{device_id}/images.
Track progress with the returned request's data.status.
| device_id required | string Example: 00000 |
| name required | string Image file name. |
{- "name": "velavu-gateway_2.12.2_argo-revB_OPEN.bin"
}{- "id": "Qm2xYv8Lr1",
- "category": "DFU_REQUEST",
- "timestamp": "2026-10-21T15:02:44+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-gateway_2.12.2_argo-revB_OPEN.bin",
- "status": "COMPLETE"
}
}Required permission: dfu:read (role SITE_MANAGER or higher)
Firmware images whose project and board match the device's current
state.app_version (<project>_<version>_<board>_<customer>).
Returns 500 if the device's app_version is not in that format.
| device_id required | string Example: 00000 |
[- {
- "name": "velavu-gateway_2.12.2_argo-revB_OPEN.bin",
- "project": "velavu-gateway",
- "version": "2.12.2",
- "board": "argo-revB",
- "channel": "STABLE",
- "comment": "string",
- "release_date": "2019-08-24T14:15:22Z"
}
]Over-the-air firmware updates for Wirepas mesh devices, distributed through a gateway.
Required permission: otap:read (role ADMIN or higher)
All OTAP_REQUEST events in the organization, newest first.
[- {
- "id": "Zk4pW7tN0c",
- "category": "OTAP_REQUEST",
- "timestamp": "2026-10-21T15:10:02+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "sequence": 1,
- "processing_delay": 0,
- "status": "STARTED"
}
}
]Required permission: otap:read (role ADMIN or higher)
Velavu's published OTAP images plus any your organization has uploaded.
[- {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "comment": "Template: velavu-52833 | Build: 2026-10-21 10:27:40 | Bootloader: legacy | Stack: nrf52833@5.9.4.1 | Images: juno-app-juno-revA@2.3.3.0, meridian-app-meridian-revB@2.3.2.0",
- "release_date": "2019-08-24T14:15:22Z",
- "crc": 4139
}
]Required permission: otap:write (role ADMIN or higher)
Uploads a scratchpad image for your organization under name. Send the file as the raw
request body with Content-Type: application/octet-stream, or as base64 text with
Content-Type: text/plain.
| name required | string Example: custom-mesh_20261021.otap Image file name. |
{- "name": "velavu-52833_legacy_20261021_103118.otap",
- "comment": "Template: velavu-52833 | Build: 2026-10-21 10:27:40 | Bootloader: legacy | Stack: nrf52833@5.9.4.1 | Images: juno-app-juno-revA@2.3.3.0, meridian-app-meridian-revB@2.3.2.0",
- "release_date": "2019-08-24T14:15:22Z",
- "crc": 4139
}Required permission: otap:read (role ADMIN or higher)
| device_id required | string Example: 00000 |
[- {
- "id": "Zk4pW7tN0c",
- "category": "OTAP_REQUEST",
- "timestamp": "2026-10-21T15:10:02+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "sequence": 1,
- "processing_delay": 0,
- "status": "STARTED"
}
}
]Required permission: otap:write (role ADMIN or higher)
Sends an OTAP image to a gateway, which distributes it through its mesh.
sequence to 0 when the image is an update for the gateway's own sink. Otherwise
omit it.processing_delay only applies when the gateway's config.wirepas.otap_mode is
PROPAGATE_AND_PROCESS_WITH_DELAY; in other modes it is ignored.config.wirepas.otap_mode is OTAP_DISABLED.| device_id required | string Example: 00000 |
| name required | string OTAP image name from |
| sequence | integer >= 0 Wirepas OTAP sequence number. Use |
| processing_delay | integer >= 0 Seconds the mesh waits before processing the image. Only used when the gateway's |
{- "name": "velavu-52833_legacy_20261021_103118.otap"
}{- "id": "Zk4pW7tN0c",
- "category": "OTAP_REQUEST",
- "timestamp": "2026-10-21T15:10:02+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "sequence": 1,
- "processing_delay": 0,
- "status": "STARTED"
}
}Required permission: otap:read (role ADMIN or higher)
The most recent OTAP request for each gateway in the site.
| site_id required | string Example: qs2oTBdeaj |
[- {
- "id": "Zk4pW7tN0c",
- "category": "OTAP_REQUEST",
- "timestamp": "2026-10-21T15:10:02+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "sequence": 1,
- "processing_delay": 0,
- "status": "STARTED"
}
}
]Required permission: otap:write (role ADMIN or higher)
Sends the OTAP image to every gateway in the site, creating one request per gateway. To keep a site on an image permanently, set a target OTAP image instead.
The sequence, processing_delay and OTAP_DISABLED rules of
POST /otap/device/{device_id}
apply to each gateway.
| site_id required | string Example: qs2oTBdeaj |
| name required | string OTAP image name from |
| sequence | integer >= 0 Wirepas OTAP sequence number. Use |
| processing_delay | integer >= 0 Seconds the mesh waits before processing the image. Only used when the gateway's |
{- "name": "velavu-52833_legacy_20261021_103118.otap"
}[- {
- "id": "Zk4pW7tN0c",
- "category": "OTAP_REQUEST",
- "timestamp": "2026-10-21T15:10:02+00:00",
- "device_id": "V0000",
- "data": {
- "name": "velavu-52833_legacy_20261021_103118.otap",
- "sequence": 1,
- "processing_delay": 0,
- "status": "STARTED"
}
}
]Required permission: rules:read (role SITE_MANAGER or higher)
[- {
- "id": "aKAh1Nobi4",
- "name": "Device rate settings for Mokosmart B5",
- "condition": "model == 'Mokosmart B5'",
- "action": {
- "config": {
- "imu": {
- "motion_cooldown_s": 15
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 180,
- "fixed_rate_s": 86400
}
}
}, - "priority": 99,
- "category": "MANAGED",
- "enabled": true,
- "created": "2026-10-24T22:46:27+00:00",
- "last_modified": "2026-10-24T23:16:42+00:00"
}
]Required permission: rules:write or rules:write-config (role SITE_MANAGER or higher)
A condition compares device properties with constants, for example
environment.temperature_c > 25 or geofence_ids CONTAINS 'fA2SLW21tr'. Each comparison
is a device property path, an operator and a constant, with exactly one space on each side
of the operator. The constant's type is taken from the property. Combine comparisons with
AND and OR; they are evaluated left to right.
Operators: ==, !=, >, <, >=, <=, CONTAINS, NOT_CONTAINS, CONTAINS_K,
NOT_CONTAINS_K.
config is applied to every device that matches the condition. Use the config field
names of the device's hardware type; fields the device does not report
are dropped. When several rules set the same field, the highest priority wins.on_active and on_deactive raise an event (and optionally an alert, SMS or email) when
a device starts or stops matching.reason |
Meaning |
|---|---|
ERR_INVALID_COND |
The condition could not be parsed or evaluated. |
ERR_INVALID_ACTION |
The action is not valid. |
ERR_INVALID_PRIO |
The priority is not valid. |
| condition required | string | ||||||
required | object (_RuleAction) | ||||||
| |||||||
| category required | string Enum: "USER" "MANAGED" | ||||||
| priority | integer >= 0 | ||||||
| enabled | boolean | ||||||
| name | string | ||||||
| description | string | ||||||
{- "name": "Device rate settings for Mokosmart B5",
- "condition": "model == 'Mokosmart B5'",
- "category": "USER",
- "priority": 10,
- "action": {
- "config": {
- "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 180,
- "fixed_rate_s": 86400
}
}
}
}{- "id": "aKAh1Nobi4",
- "name": "Device rate settings for Mokosmart B5",
- "condition": "model == 'Mokosmart B5'",
- "action": {
- "config": {
- "imu": {
- "motion_cooldown_s": 15
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 180,
- "fixed_rate_s": 86400
}
}
}, - "priority": 99,
- "category": "MANAGED",
- "enabled": true,
- "created": "2026-10-24T22:46:27+00:00",
- "last_modified": "2026-10-24T23:16:42+00:00"
}Required permission: rules:read (role SITE_MANAGER or higher)
| rule_id required | string Example: aKAh1Nobi4 |
{- "id": "aKAh1Nobi4",
- "name": "Device rate settings for Mokosmart B5",
- "condition": "model == 'Mokosmart B5'",
- "action": {
- "config": {
- "imu": {
- "motion_cooldown_s": 15
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 180,
- "fixed_rate_s": 86400
}
}
}, - "priority": 99,
- "category": "MANAGED",
- "enabled": true,
- "created": "2026-10-24T22:46:27+00:00",
- "last_modified": "2026-10-24T23:16:42+00:00"
}Required permission: rules:write or rules:write-config (role SITE_MANAGER or higher)
A condition compares device properties with constants, for example
environment.temperature_c > 25 or geofence_ids CONTAINS 'fA2SLW21tr'. Each comparison
is a device property path, an operator and a constant, with exactly one space on each side
of the operator. The constant's type is taken from the property. Combine comparisons with
AND and OR; they are evaluated left to right.
Operators: ==, !=, >, <, >=, <=, CONTAINS, NOT_CONTAINS, CONTAINS_K,
NOT_CONTAINS_K.
config is applied to every device that matches the condition. Use the config field
names of the device's hardware type; fields the device does not report
are dropped. When several rules set the same field, the highest priority wins.on_active and on_deactive raise an event (and optionally an alert, SMS or email) when
a device starts or stops matching.reason |
Meaning |
|---|---|
ERR_INVALID_COND |
The condition could not be parsed or evaluated. |
ERR_INVALID_ACTION |
The action is not valid. |
ERR_INVALID_PRIO |
The priority is not valid. |
| rule_id required | string Example: aKAh1Nobi4 |
| condition | string | ||||||
object (_RuleAction) | |||||||
| |||||||
| priority | integer >= 0 | ||||||
| enabled | boolean | ||||||
| name | string | ||||||
| description | string | ||||||
{- "enabled": false
}{- "id": "aKAh1Nobi4",
- "name": "Device rate settings for Mokosmart B5",
- "condition": "model == 'Mokosmart B5'",
- "action": {
- "config": {
- "imu": {
- "motion_cooldown_s": 15
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 180,
- "fixed_rate_s": 86400
}
}
}, - "priority": 99,
- "category": "MANAGED",
- "enabled": true,
- "created": "2026-10-24T22:46:27+00:00",
- "last_modified": "2026-10-24T23:16:42+00:00"
}Required permission: integrations:read (role VIEWER or higher)
Returns {} when no integrations are connected.
{- "mappedin": {
- "api_key": "mik_xxxxxxxxxxxxxxxxxxxxxxxx",
- "token": "eyJhbGciOi...",
- "token_expiry": "2026-10-26T22:29:26+00:00",
- "imports": [
- {
- "venue_id": "67881b4666a208000badecc4",
- "site_id": "qs2oTBdeaj"
}
]
}
}Required permission: integrations:write (role SITE_MANAGER or higher)
| api_key required | string MappedIn API key. |
| secret required | string MappedIn API secret. Stored by Velavu and never returned. |
{- "api_key": null,
- "secret": null
}{- "mappedin": {
- "api_key": "mik_xxxxxxxxxxxxxxxxxxxxxxxx",
- "token": "eyJhbGciOi...",
- "token_expiry": "2026-10-26T22:29:26+00:00",
- "imports": [
- {
- "venue_id": "67881b4666a208000badecc4",
- "site_id": "qs2oTBdeaj"
}
]
}
}Required permission: integrations:write (role SITE_MANAGER or higher)
Creates (or updates) a site with the venue's floors and walls.
| venue_id required | string MappedIn venue ID. |
{- "api_key": "mik_xxxxxxxxxxxxxxxxxxxxxxxx",
- "token": "eyJhbGciOi...",
- "token_expiry": "2026-10-26T22:29:26+00:00",
- "imports": [
- {
- "venue_id": "67881b4666a208000badecc4",
- "site_id": "qs2oTBdeaj"
}
]
}Forward mesh traffic from selected gateways to your own Wirepas backend (MQTT broker).
Required permission: backends:read (role VIEWER or higher)
[- {
- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}
]Required permission: backends:write (role ADMIN or higher)
| name required | string | ||||||||||||||||
required | object (Config) | ||||||||||||||||
| |||||||||||||||||
object (Certificates) | |||||||||||||||||
| |||||||||||||||||
{- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "use_backend_api": true,
- "username": "string",
- "password": "string",
- "wirepas_config": {
- "network_addr": 0,
- "network_chan": 0,
- "diag_interval_s": 0,
- "node_addr": 0,
- "auth_key": "string",
- "encr_key": "string"
}, - "upstream_eps": [
- {
- "wirepas_channel": 0,
- "mqtt_topic": "string"
}
], - "downstream_eps": [
- {
- "wirepas_channel": 0,
- "mqtt_topic": "string"
}
]
}, - "certificates": {
- "ca_cert": "string",
- "server_cert": "string",
- "private_key": "string"
}
}{- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}Required permission: backends:read (role VIEWER or higher)
| backend_id required | string |
{- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}Required permission: backends:write (role ADMIN or higher)
Connected gateways are sent the new configuration.
| backend_id required | string |
| name | string | ||||||||||||||||
object (Config) | |||||||||||||||||
| |||||||||||||||||
object (Certificates) | |||||||||||||||||
| |||||||||||||||||
{- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "use_backend_api": true,
- "username": "string",
- "password": "string",
- "wirepas_config": {
- "network_addr": 0,
- "network_chan": 0,
- "diag_interval_s": 0,
- "node_addr": 0,
- "auth_key": "string",
- "encr_key": "string"
}, - "upstream_eps": [
- {
- "wirepas_channel": 0,
- "mqtt_topic": "string"
}
], - "downstream_eps": [
- {
- "wirepas_channel": 0,
- "mqtt_topic": "string"
}
]
}, - "certificates": {
- "ca_cert": "string",
- "server_cert": "string",
- "private_key": "string"
}
}{- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}Required permission: backends:write (role ADMIN or higher)
Only argo gateways can forward to a backend.
| backend_id required | string |
| device_id required | string Example: 00000 |
{- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}Required permission: backends:write (role ADMIN or higher)
| backend_id required | string |
| device_id required | string Example: 00000 |
{- "id": "string",
- "name": "string",
- "config": {
- "host": "string",
- "port": 0,
- "username": "string",
- "password": "string",
- "use_backend_api": true,
- "wirepas_config": { },
- "upstream_eps": [
- { }
], - "downstream_eps": [
- { }
]
}, - "certificates": { },
- "devices": [
- {
- "id": "string",
- "connected": true,
- "requires_certs": true
}
]
}Required permission: organization:read (role VIEWER or higher)
{- "customer_id": "swJd",
- "name": "Velavu Sandbox",
- "settings": {
- "rules": {
- "Mokosmart B5": "aKAh1Nobi4",
- "Mokosmart L02": "okyuyzN8N8",
- "Pavo HD": "v8Fty0w2MB"
}
}, - "meta": {
- "assets": {
- "categories": [
- "EQUIPMENT",
- "PERSON",
- "VEHICLE"
], - "category_groups": {
- "EQUIPMENT": [
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment"
], - "PERSON": [
- "Patient",
- "Nurse",
- "Doctor"
]
}, - "groups": [
- "Patient",
- "Doctor",
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment",
- "Nurse"
]
}, - "devices": {
- "models": [
- "Mokosmart B5",
- "Mokosmart L02",
- "Pavo HD",
- "Vesta"
]
}
}, - "allow_child_orgs": true
}Required permission: organization:write (role ADMIN or higher)
| name | string | ||
object | |||
| |||
{- "name": "Velavu Sandbox"
}{- "customer_id": "swJd",
- "name": "Velavu Sandbox",
- "settings": {
- "rules": {
- "Mokosmart B5": "aKAh1Nobi4",
- "Mokosmart L02": "okyuyzN8N8",
- "Pavo HD": "v8Fty0w2MB"
}
}, - "meta": {
- "assets": {
- "categories": [
- "EQUIPMENT",
- "PERSON",
- "VEHICLE"
], - "category_groups": {
- "EQUIPMENT": [
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment"
], - "PERSON": [
- "Patient",
- "Nurse",
- "Doctor"
]
}, - "groups": [
- "Patient",
- "Doctor",
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment",
- "Nurse"
]
}, - "devices": {
- "models": [
- "Mokosmart B5",
- "Mokosmart L02",
- "Pavo HD",
- "Vesta"
]
}
}, - "allow_child_orgs": true
}Required permission: organization:read (role VIEWER or higher)
[- {
- "customer_id": "swJd",
- "name": "Velavu Sandbox",
- "settings": {
- "rules": {
- "Mokosmart B5": "aKAh1Nobi4",
- "Mokosmart L02": "okyuyzN8N8",
- "Pavo HD": "v8Fty0w2MB"
}
}, - "meta": {
- "assets": {
- "categories": [
- "EQUIPMENT",
- "PERSON",
- "VEHICLE"
], - "category_groups": {
- "EQUIPMENT": [
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment"
], - "PERSON": [
- "Patient",
- "Nurse",
- "Doctor"
]
}, - "groups": [
- "Patient",
- "Doctor",
- "Mobility Equipment",
- "Emergency Equipment",
- "Medical Equipment",
- "Cleaning Equipment",
- "Nurse"
]
}, - "devices": {
- "models": [
- "Mokosmart B5",
- "Mokosmart L02",
- "Pavo HD",
- "Vesta"
]
}
}, - "allow_child_orgs": true
}
]Required permission: organization:write (role ADMIN or higher)
Creates an organization under yours, with the given admin user, default rules and your
device models. Requires allow_child_orgs on your organization.
The response body is currently null; list child organizations to get the new one.
| name required | string |
| admin_name required | string |
| admin_email required | string |
{- "name": "Acme Hospital",
- "admin_name": "Jane Smith",
- "admin_email": "jane@example.com"
}nullRequired permission: organization:write (role ADMIN or higher)
The child organization must have no devices.
| customer_id required | string The child organization's |
nullRequired permission: users:read (role VIEWER or higher)
[- {
- "email": "jane@example.com",
- "name": "Jane Smith",
- "role": "ADMIN",
- "status": "CONFIRMED",
- "settings": {
- "showWelcomeScreen": false
}, - "permissions": [
- "alerts:delete",
- "alerts:read",
- "api-tokens:delete",
- "api-tokens:read",
- "api-tokens:write"
]
}
]Required permission: users:write (role SITE_MANAGER or higher)
Creates the user and emails them a temporary password. role defaults to ADMIN when
omitted, so set it explicitly.
| name required | string |
| email required | string |
| role | string (Role) Enum: "VIEWER" "OPERATOR" "SITE_MANAGER" "ADMIN" |
{- "name": "Jane Smith",
- "email": "jane@example.com",
- "role": "OPERATOR"
}{- "email": "jane@example.com",
- "name": "Jane Smith",
- "role": "ADMIN",
- "status": "CONFIRMED",
- "settings": {
- "showWelcomeScreen": false
}, - "permissions": [
- "alerts:delete",
- "alerts:read",
- "api-tokens:delete",
- "api-tokens:read",
- "api-tokens:write"
]
}Required permission: users:read (role VIEWER or higher)
| email required | string <email> Example: jane@example.com The user's email address (URL-encoded). |
{- "email": "jane@example.com",
- "name": "Jane Smith",
- "role": "ADMIN",
- "status": "CONFIRMED",
- "settings": {
- "showWelcomeScreen": false
}, - "permissions": [
- "alerts:delete",
- "alerts:read",
- "api-tokens:delete",
- "api-tokens:read",
- "api-tokens:write"
]
}Required permission: users:write or users:write-self (role VIEWER or higher)
Changes the fields you send. Changing role needs users:write; users with only
users:write-self can update their own name and settings.
| email required | string <email> Example: jane@example.com The user's email address (URL-encoded). |
| name | string | ||
object Free-form settings, replaced as a whole. | |||
| |||
| role | string (Role) Enum: "VIEWER" "OPERATOR" "SITE_MANAGER" "ADMIN" | ||
{- "role": "SITE_MANAGER"
}{- "email": "jane@example.com",
- "name": "Jane Smith",
- "role": "ADMIN",
- "status": "CONFIRMED",
- "settings": {
- "showWelcomeScreen": false
}, - "permissions": [
- "alerts:delete",
- "alerts:read",
- "api-tokens:delete",
- "api-tokens:read",
- "api-tokens:write"
]
}Required permission: users:write or users:write-self (role VIEWER or higher)
| email required | string <email> Example: jane@example.com The user's email address (URL-encoded). |
| image required | string^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-... The image file, base64-encoded. |
{- "image": null
}{- "email": "jane@example.com",
- "name": "Jane Smith",
- "role": "ADMIN",
- "status": "CONFIRMED",
- "settings": {
- "showWelcomeScreen": false
}, - "permissions": [
- "alerts:delete",
- "alerts:read",
- "api-tokens:delete",
- "api-tokens:read",
- "api-tokens:write"
]
}Required permission: api-tokens:read (role ADMIN or higher)
Tokens newest first. The secret token value is not included.
[- {
- "id": "string",
- "name": "string",
- "role": "VIEWER",
- "created": "2019-08-24T14:15:22Z",
- "expiry": "2019-08-24T14:15:22Z",
- "creator": "string"
}
]Required permission: api-tokens:write (role ADMIN or higher)
The response is the only time the secret token is returned. role defaults to
ADMIN when omitted, so set it explicitly.
| name required | string |
| role | string (Role) Enum: "VIEWER" "OPERATOR" "SITE_MANAGER" "ADMIN" |
| expiry | string When the token stops working (ISO 8601, in the future). Omit for a token that never expires. |
{- "name": "Warehouse integration",
- "role": "VIEWER",
- "expiry": "2027-10-26T00:00:00+00:00"
}{- "id": "string",
- "name": "string",
- "role": "VIEWER",
- "created": "2019-08-24T14:15:22Z",
- "expiry": "2019-08-24T14:15:22Z",
- "creator": "string",
- "token": "string"
}Client certificates for the MQTT event stream.
Required permission: mqtt:write (role ADMIN or higher)
The response is the only time the certificate PEM and private key are returned.
| name required | string |
{- "name": "Data warehouse"
}{- "id": "string",
- "name": "string",
- "created": "2019-08-24T14:15:22Z",
- "creator": "string",
- "certificate_pem": "string",
- "private_key": "string"
}Required permission: devices:read (role VIEWER or higher)
Device models enabled for your organization.
[- {
- "name": "Vesta",
- "hardware": "argo",
- "categories": [
- "TAG"
], - "manufacturer": "Velavu",
- "indicator": "led",
- "images": {
}, - "default_config": {
- "heartbeat_rate_s": 1800,
- "disable_offline_sink": true,
- "ulp_mode": false,
- "imu": {
- "motion_cooldown_s": 15,
- "motion_detection": false
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 30,
- "fixed_rate_s": 0
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "gateway_mode": "VLV_BACKEND",
- "low_latency_mode": true,
- "otap_mode": "OTAP_DISABLED",
- "routing_info": false
}
}
}
]Required permission: devices:read (role VIEWER or higher)
| model_name required | string Example: Vesta Device model name (URL-encoded). |
{- "name": "Vesta",
- "hardware": "argo",
- "categories": [
- "TAG"
], - "manufacturer": "Velavu",
- "indicator": "led",
- "images": {
}, - "default_config": {
- "heartbeat_rate_s": 1800,
- "disable_offline_sink": true,
- "ulp_mode": false,
- "imu": {
- "motion_cooldown_s": 15,
- "motion_detection": false
}, - "positioning": {
- "dynamic_mode": true,
- "dynamic_rate_s": 30,
- "fixed_rate_s": 0
}, - "vehicle": {
- "allow_driving": true,
- "driving_timeout_s": 210
}, - "wirepas": {
- "gateway_mode": "VLV_BACKEND",
- "low_latency_mode": true,
- "otap_mode": "OTAP_DISABLED",
- "routing_info": false
}
}
}Required permission: billing:read (role ADMIN or higher)
{- "id": "string",
- "period_start": "2019-08-24T14:15:22Z",
- "period_end": "2019-08-24T14:15:22Z",
- "status": "string",
- "total": 0,
- "usage": [
- { }
],
}