SNAP Thing Services API
SNAP Thing Services API Version 1.7.3
Account ¶
Handles requests for the /changePassword resource path ¶
Update password for currently authenticated userPOST/api/v1/changePassword
Password complexity rules are enforced when changing the user’s password; the new password must be at least 8 characters long and include a combination of lowercase and uppercase letters, numbers, and symbols.
Example URI
Body
{
"new": "yourNewPassword1#",
"old": "yourOldPassword"
}Schema
{
"title": "Update device",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A device",
"required": [
"old",
"new"
],
"properties": {
"new": {
"pattern_description": "Password must be at least 8 characters and include a combination of lowercase and uppercase letters, numbers, and symbols.",
"description": "New password",
"type": "string",
"pattern": "^(?=.*[0-9])(?=.*[!@#$%^&*_\\-])(?=.*?[a-z])(?=.*?[A-Z])[a-zA-Z0-9!@#$%^&*_\\-]{8,}$"
},
"old": {
"type": "string",
"description": "Old password"
}
}
}200Successfully updated password.
Body
{
"data": "Successfully changed password"
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "string"
}
}
}400The password could not be changed for any number of reasons (e.g. the old password was incorrect, or the new password does not meet the complexity requirements). The message property of the response should indicate the reason for the failure.
Body
{
"error": {
"message": {
"new": "Password must be at least 8 characters and include a combination of lowercase and uppercase letters, numbers, and symbols."
}
}
}Schema
{
"type": "object",
"properties": {
"error": {
"message": {
"type": "string"
},
"type": "object"
}
}
}Actuation ¶
Actuation Config api handler to toggle actuation ¶
Used to get the actuation config statusGET/api/v1/actuation/config
Example URI
200actuation enabled status
Body
{
"data": {
"isActuationEnabled": true
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"isActuationEnabled": {
"type": "boolean",
"description": "true or false"
}
}
}
}
}Used to toggle actuation requestPOST/api/v1/actuation/config
Example URI
Body
{
"isActuationEnabled": false
}Schema
{
"properties": {
"isActuationEnabled": {
"type": "boolean",
"description": "True or False"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "Toggle Actuation for devices",
"required": [
"isActuationEnabled"
],
"title": "Toggle Actuation for devices"
}200actuation enabled status
Body
{
"data": {
"isActuationEnabled": true
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"isActuationEnabled": {
"type": "boolean",
"description": "true or false"
}
}
}
}
}Actuation api handler ¶
Get all actuation resultsGET/api/v1/actuation/requests
Example URI
200List all actuation results.
Body
{
"data": [
{
"startedAt": "2017-01-12T08:50:21.726736",
"deviceTypes": [],
"finishedAt": "2017-01-12T08:50:21.846736",
"devices": [
"098231",
"09a1b4"
],
"results": [
{
"result": "success",
"address": "098231"
},
{
"result": "failure",
"address": "09a1b4"
}
],
"function": "light_level",
"status": "Completed With Errors",
"createdAt": "2017-01-12T08:50:21.506736",
"id": "6f992502-33f0-47d4-a01e-973593e1915d",
"parameters": [
256
],
"href": "https://localhost:3000/api/v1/actuation/requests/6f992502-33f0-47d4-a01e-973593e1915d"
},
{
"startedAt": "2017-01-10T08:50:21.726736",
"deviceTypes": [
"devicetype1"
],
"finishedAt": "2017-01-10T08:50:21.846736",
"devices": [],
"results": [
{
"result": "success",
"address": "098231"
}
],
"function": "actuate_me",
"status": "Completed",
"createdAt": "2017-01-10T08:50:21.506736",
"id": "7r592502-33f0-47d4-a01e-973593e1915d",
"parameters": [],
"href": "https://localhost:3000/api/v1/actuation/requests/7r592502-33f0-47d4-a01e-973593e1915d"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"startedAt": {
"type": "string",
"description": "Time at which actuation started"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "List of name of device type"
},
"type": "array"
},
"finishedAt": {
"type": "string",
"description": "Time at which actuation finished"
},
"devices": {
"items": {
"type": "string",
"description": "List of device MAC addresses"
},
"type": "array"
},
"results": {
"type": "string",
"description": "Result of actuation request"
},
"function": {
"type": "string",
"description": "Function Name"
},
"status": {
"type": "string",
"description": "Status of the actuation request"
},
"createdAt": {
"type": "string",
"description": "Time at which actuation initiated"
},
"id": {
"type": "string",
"description": "Unique identifier for this actuation"
},
"parameters": {
"items": {
"anyOf": [
{
"type": [
"string",
"boolean",
"null",
"integer"
]
}
],
"description": "List of parameters"
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this actuation result"
}
}
},
"type": "array"
}
}
}Creates new actuation requestPOST/api/v1/actuation/requests
Example URI
Body
{
"deviceTypes": [
"thesedevices",
"thosedevices"
],
"function": "actuate_me",
"parameters": [
"<stringval>",
1,
null,
true
],
"devices": [
"0600a3",
"0833a4",
"0534fe"
]
}Schema
{
"properties": {
"deviceTypes": {
"items": {
"type": "string",
"description": "List of types of device. This must exist in the database already."
},
"type": "array"
},
"function": {
"pattern_description": "Actuation functions must be valid public SNAPpy functions. (ex: 'data', 'actuate_2B')",
"pattern": "^[a-zA-Z]\\w*$",
"type": "string",
"description": "SNAPpy script function"
},
"parameters": {
"items": {
"anyOf": [
{
"type": [
"string",
"boolean",
"null",
"integer"
]
}
]
},
"type": "array"
},
"devices": {
"items": {
"pattern_description": "A valid SNAP Address must be a hex value of at least 6 digits with optional period or colon delimiters (ex:\"a18ca9\", \"04:3E:82\").",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"type": "array"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "Actuate devices",
"required": [
"function"
],
"title": "Actuate devices"
}202Headers
Location: https://localhost:3000/api/v1/tasks/83f4e242-e89d-407b-95e5-a5a603427217400At least one device address required
Body
{
"error": {
"message": "At least one device address required"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}400Parameter string should be base64 encoded
Body
{
"error": {
"message": "Parameter string should be base64 encoded"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}400Combined size of function name and parameter list exceeds maximum packet size
Body
{
"error": {
"message": "Combined size of function name and parameter list exceeds maximum packet size"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}400If actuation is unlicensed, an actuation request which targets multiple devices will not be sent
Body
{
"error": {
"message": "Your license only permits actuation of one device at a time. Please contact your sales representative to discuss upgrading your license to support multiple simultaneous actuations."
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Actuation result handler ¶
Get a single actuation resultGET/api/v1/actuation/requests/{actuationId}
Example URI
- actuationId
integer(required) Example: 1Unique identifier for an actuation result
200Get actuation result details.
Body
{
"data": {
"startedAt": "2017-01-10T08:50:21.726736",
"deviceTypes": [
"devicetype1"
],
"finishedAt": "2017-01-10T08:50:21.846736",
"devices": [],
"results": [
{
"result": "failure",
"address": "60866a"
},
{
"result": "success",
"address": "608477"
}
],
"function": "actuate_me",
"status": "Completed With Errors",
"createdAt": "2017-01-10T08:50:21.506736",
"id": "e00667ce-78b5-4595-8288-3ff0e50ed147",
"parameters": [],
"href": "https://localhost:3000/api/v1/actuation/requests/e00667ce-78b5-4595-8288-3ff0e50ed147"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"startedAt": {
"type": "string",
"description": "Time at which actuation started"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "List of device type descriptions"
},
"type": "array"
},
"finishedAt": {
"type": "string",
"description": "Time at which actuation finished"
},
"devices": {
"items": {
"type": "string",
"description": "List of device MAC addresses"
},
"type": "array"
},
"results": {
"items": {
"result": {
"type": "string",
"description": "Outcome of the attempted actuation, either success or failure"
},
"address": {
"type": "string",
"description": "MAC address for the device described in this result"
}
},
"type": "array"
},
"function": {
"type": "string",
"description": "Name of the function"
},
"status": {
"type": "string",
"description": "Status of the actuation request"
},
"createdAt": {
"type": "string",
"description": "Time at which actuation initiated"
},
"id": {
"type": "integer",
"description": "Unique identifier for this device type"
},
"parameters": {
"items": {
"anyOf": [
{
"type": [
"string",
"boolean",
"null",
"integer"
]
}
],
"description": "List of parameters"
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this device type resource"
}
}
},
"type": "array"
}
}
}404No such result.
Body
{
"error": {
"message": "Actuation result could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Administration ¶
Backup ¶
Backup databaseGET/api/v1/backup
Create a backup of the current synapse-network-service database.
Example URI
200Successfully backed up database
Body
"Backup file: synapse-network-service.sqlite"400The database could not be backed up.
Body
{
"error": {
"message": "Unable to backup the database. Please check the server logs for more information."
}
}Schema
{
"type": "object",
"properties": {
"error": {
"message": {
"type": "string"
},
"type": "object"
}
}
}Configuration ¶
Network ¶
Handles requests for the /network resource path.
Get the current network settingsGET/api/v1/network
Example URI
200Get current network settings details.
Body
{
"data": {
"configured_settings": {
"channel": 10,
"encryptionKey": "YWFhYWJiYmJjY2NjZGRkZA==",
"encryptionType": "AES-128",
"packetCrc": true,
"networkId": "0x3ab3",
"rpcCrc": false
},
"bridge_addr": "012345",
"actual_settings": {
"channel": 10,
"encryptionKey": "YWFhYWJiYmJjY2NjZGRkZA==",
"encryptionType": "AES-128",
"packetCrc": true,
"networkId": "0x3ab3",
"rpcCrc": false
}
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"configured_settings": {
"type": "object",
"properties": {
"channel": {
"type": "integer",
"description": "The RF channel"
},
"encryptionKey": {
"media": {
"binaryEncoding": "base64",
"type": "octet-stream"
},
"type": "string",
"description": "The Base64 encoded encryption key"
},
"encryptionType": {
"enum": [
"None",
"AES-128",
"Basic"
],
"description": "The type of encryption used to communicate"
},
"packetCrc": {
"type": "boolean",
"description": "Indicates whether packet-level CRC validation should be enabled"
},
"networkId": {
"type": "string",
"description": "The network identifier (ex: '0x1c2c')"
},
"rpcCrc": {
"type": "boolean",
"description": "Indicates whether the RPC CRC packet integrity check should be enabled"
}
},
"description": "Configured network settings"
},
"bridge_addr": {
"type": "string",
"description": "Device MAC address"
},
"actual_settings": {
"type": "object",
"properties": {
"channel": {
"type": "integer",
"description": "The RF channel"
},
"encryptionKey": {
"media": {
"binaryEncoding": "base64",
"type": "octet-stream"
},
"type": "string",
"description": "The Base64 encoded encryption key"
},
"encryptionType": {
"enum": [
"None",
"AES-128",
"Basic"
],
"description": "The type of encryption used to communicate"
},
"packetCrc": {
"type": "boolean",
"description": "Indicates whether packet-level CRC validation is enabled"
},
"networkId": {
"type": "string",
"description": "The network identifier (ex: '0x1c2c')"
},
"rpcCrc": {
"type": "boolean",
"description": "Indicates whether the RPC CRC packet integrity check is enabled"
}
},
"description": "Actual bridge node network settings"
}
}
}
}
}400Could not get network settings.
Body
{
"apiVersion": "v1",
"error": {
"message": "Could not get network settings",
"code": 400
}
}Schema
{
"type": "object",
"properties": {
"apiVersion": {
"type": "string"
},
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"code": {
"type": "integer",
"description": "HTTP response status"
}
}
}
}
}Update the current network settingsPUT/api/v1/network
Example URI
Body
{
"channel": 10,
"encryptionKey": "YWFhYWJiYmJjY2NjZGRkZA==",
"encryptionType": "AES-128",
"packetCrc": true,
"networkId": "0x3ab3",
"rpcCrc": false
}Schema
{
"properties": {
"channel": {
"type": "integer",
"description": "The RF channel"
},
"encryptionKey": {
"media": {
"binaryEncoding": "base64",
"type": "octet-stream"
},
"type": "string",
"description": "The Base64 encoded encryption key"
},
"encryptionType": {
"enum": [
"None",
"AES-128",
"Basic"
],
"description": "The type of encryption used to communicate"
},
"packetCrc": {
"type": "boolean",
"description": "Indicates whether packet-level CRC validation should be enabled"
},
"networkId": {
"type": "string",
"description": "The network identifier (ex: '0x1c2c')"
},
"rpcCrc": {
"type": "boolean",
"description": "Indicates whether the RPC CRC packet integrity check should be enabled"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A group of network settings",
"required": [
"channel",
"networkId",
"rpcCrc",
"packetCrc",
"encryptionType",
"encryptionKey"
],
"title": "Update network settings"
}200Successfully updated network settings.
Headers
Content-Type: application/jsonBody
{
"data": {
"channel": 10,
"encryptionKey": "YWFhYWJiYmJjY2NjZGRkZA==",
"encryptionType": "AES-128",
"packetCrc": true,
"networkId": "0x3ab3",
"rpcCrc": false
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"channel": {
"type": "integer",
"description": "The RF channel"
},
"encryptionKey": {
"media": {
"binaryEncoding": "base64",
"type": "octet-stream"
},
"type": "string",
"description": "The Base64 encoded encryption key"
},
"encryptionType": {
"enum": [
"None",
"AES-128",
"Basic"
],
"description": "The type of encryption used to communicate"
},
"packetCrc": {
"type": "boolean",
"description": "Indicates whether packet-level CRC validation is enabled"
},
"networkId": {
"type": "string",
"description": "The network identifier (ex: '0x1c2c')"
},
"rpcCrc": {
"type": "boolean",
"description": "Indicates whether the RPC CRC packet integrity check is enabled"
}
}
}
}
}400Could not update network settings.
Body
{
"apiVersion": "v1",
"error": {
"message": "Could not update network settings",
"code": 400
}
}Schema
{
"type": "object",
"properties": {
"apiVersion": {
"type": "string"
},
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"code": {
"type": "integer",
"description": "HTTP response status"
}
}
}
}
}Data Collector ¶
Data Collector Collection ¶
Get the list of data collectorsGET/api/v1/dc
Example URI
200List all data collectors.
Headers
Content-Type: application/jsonBody
{
"data": [
{
"initRpcName": "setReceiverAddress",
"deviceTypes": [
"sensors"
],
"name": "dc1",
"dataRpcName": "acceptData",
"id": 1,
"data_collector_type": "asynchronous",
"href": "https://localhost:3000/api/v1/dc/dc1"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Name of data collector"
},
"id": {
"type": "integer",
"description": "Unique identifier for this data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
},
"type": "array"
}
}
}Create a data collectorPOST/api/v1/dc
Example URI
Body
{
"pollInterval": 60,
"deviceTypes": [
"sensors"
],
"dataCollectorType": "synchronous",
"queryFunction": "data",
"name": "dc1"
}Schema
{
"title": "Add data collector",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A data collector",
"required": [
"name",
"deviceTypes"
],
"properties": {
"pollInterval": {
"minimum": 5,
"description": "Number of seconds between polls (required for sync only)",
"type": "integer",
"maximum": 86400
},
"queryFunction": {
"pattern_description": "Query functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of query function (required for sync only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
},
"initRpcName": {
"anyOf": [
{
"pattern_description": "Init functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of function implemented by SNAPpy script (required for async only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
},
{
"type": "null"
}
]
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"name": {
"pattern_description": "Data collector names must be letters, numbers, underscores, periods, and dashes. (ex: 'dc1', 'Data_Collector.1-b')",
"description": "Name of data collector",
"type": "string",
"pattern": "^[A-z0-9_.-]+$"
},
"dataRpcName": {
"pattern_description": "Data functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of the RPC that the receiver will listen on for new data (required for async only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
}
}
}201Successfully created data collector.
Body
{
"data": {
"initRpcName": "setReceiverAddress",
"deviceTypes": [
"sensors"
],
"dataCollectorType": "asynchronous",
"name": "dc1",
"dataRpcName": "acceptData",
"id": 1,
"href": "https://localhost:3000/api/v1/dc/dc1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Name of data collector"
},
"id": {
"type": "integer",
"description": "Unique identifier for this data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
}
}
}409A data collector with this name already exists.
Body
{
"error": {
"message": "A data collector with this name already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}400A data collector could not be added with these attributes.
Body
{
"error": {
"message": "A data collector could not be added with these attributes"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Data Collector ¶
Delete a data collectorDELETE/api/v1/dc/{name}
Example URI
- name
string(required) Example: dc1Name of a data collector.
204Successfully deleted data collector.
404No data collector found for this identifier.
Body
{
"error": {
"message": "Data collector could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Data Collector Configuration ¶
Get a single data collector's configurationGET/api/v1/dc/{name}/config
Example URI
- name
string(required) Example: dc1Name of a data collector.
200Get data collector details.
Headers
Content-Type: application/jsonBody
{
"data": {
"pollInterval": 60,
"queryFunction": "data",
"deviceTypes": [
"sensors"
],
"dataCollectorType": "synchronous",
"name": "dc1",
"id": 1,
"href": "https://localhost:3000/api/v1/dc/dc1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Name of data collector"
},
"id": {
"type": "integer",
"description": "Unique identifier for this data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
}
}
}Update a single data collectorPUT/api/v1/dc/{name}/config
Example URI
- name
string(required) Example: dc1Name of a data collector.
Body
{
"deviceTypes": [
"sensors"
],
"dataCollectorType": "asynchronous",
"initRpcName": "setReceiverAddress",
"name": "dc1",
"dataRpcName": "acceptData"
}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "A data collector",
"type": "object",
"properties": {
"pollInterval": {
"minimum": 5,
"description": "Number of seconds between polls (required for sync only)",
"type": "integer",
"maximum": 86400
},
"queryFunction": {
"pattern_description": "Query functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of query function (required for sync only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
},
"initRpcName": {
"anyOf": [
{
"pattern_description": "Init functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of function implemented by SNAPpy script (required for async only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
},
{
"type": "null"
}
]
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"name": {
"pattern_description": "Data collector names must be letters, numbers, underscores, periods, and dashes. (ex: 'dc1', 'Data_Collector.1-b')",
"description": "Name of data collector",
"type": "string",
"pattern": "^[A-z0-9_.-]+$"
},
"dataRpcName": {
"pattern_description": "Data functions must be valid public SNAPpy functions. (ex: 'data', 'query_2B')",
"description": "Name of the RPC that the receiver will listen on for new data (required for async only)",
"type": "string",
"pattern": "^[a-zA-Z]\\w*$"
}
},
"title": "Update a data collector"
}200Successfully updated data collector.
Body
{
"data": {
"initRpcName": "setReceiverAddress",
"deviceTypes": [
"sensors"
],
"dataCollectorType": "asynchronous",
"name": "dc1",
"dataRpcName": "acceptData",
"id": 1,
"href": "https://localhost:3000/api/v1/dc/dc1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Description of data collector type"
},
"id": {
"type": "integer",
"description": "Unique identifier for this data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
}
}
}Devices ¶
Device Collection ¶
Get list of devicesGET/api/v1/devices{?type}{&expand}
Example URI
- type
string(optional) Example: SensorLimit result to devices with this device type.
- expand
string(optional) Example: firmware,imageExpand HREF properties to full objects (e.g. ?expand=firmware,image).
200List all devices.
Body
{
"data": [
{
"firmware": {
"href": "https://localhost:3000/api/v1/firmware/2.7.1"
},
"addr": "aabbcc",
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
},
"platform": "RF200",
"upgrading": false,
"description": "test",
"deviceType": "Deck1",
"id": 2,
"href": "https://localhost:3000/api/v1/devices/2"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
},
"description": "Firmware on device"
},
"addr": {
"pattern_description": "A valid SNAP address must be a hex value of at least 6 digits with optional period or colon delimiters (ex: a18ca9, 04:3E:82).",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "Device MAC address"
},
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this image resource"
}
},
"description": "Software on device"
},
"platform": {
"type": "string",
"description": "Hardware platform"
},
"upgrading": {
"type": "boolean",
"description": "Indicates whether device is upgrading"
},
"description": {
"type": "string",
"description": "User defined name for the device"
},
"deviceType": {
"type": "string",
"description": "Device type"
},
"id": {
"type": "integer",
"description": "Unique identifier for this device"
},
"href": {
"type": "string",
"description": "URI for this device resource"
}
}
},
"type": "array"
}
}
}Create a devicePOST/api/v1/devices
Clients should use this endpoint to create a single new Device resource. If you need to create
a lot of new devices in a bulk operation, please refer to the Device Batches <device_batches.html>_ section.
Example URI
Body
{
"deviceType": "Deck1",
"addr": "ccddee",
"platform": "RF200",
"description": "Device1"
}Schema
{
"properties": {
"deviceType": {
"type": "string",
"description": "The type of device. This must exist in the database already."
},
"addr": {
"pattern_description": "A valid SNAP Address must be a hex value of at least 6 digits with optional period or colon delimiters (ex:\"a18ca9\", \"04:3E:82\").",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"platform": {
"type": "string",
"description": "The device platform (ex: RF200)"
},
"description": {
"type": "string",
"description": "Description of the device"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A device",
"required": [
"addr",
"description",
"platform",
"deviceType"
],
"title": "Add device"
}201Successfully created device.
Headers
Content-Type: application/json
Location: https://localhost:3000/api/v1/devices/6Body
{
"data": {
"firmware": {
"href": "Unknown"
},
"addr": "ccddee",
"image": {
"href": "Unknown"
},
"platform": "RF200",
"upgrading": false,
"description": "Device1",
"deviceType": "Deck1",
"id": 6,
"href": "https://localhost:3000/api/v1/devices/6"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"addr": {
"type": "string",
"description": "Address of device"
},
"platform": {
"type": "string",
"description": "Type of platform"
},
"upgrading": {
"type": "boolean",
"description": "Indicates whether device is upgrading"
},
"description": {
"type": "string",
"description": "Description of device"
},
"deviceType": {
"type": "string",
"description": "Type of device"
},
"id": {
"type": "integer",
"description": "Unique identifier for device"
},
"href": {
"type": "string",
"description": "URI for this device resource"
}
}
}
}
}400Can’t create this device because required device properties are missing.
Body
{
"error": {
"message": "The following properties are required: addr, description, platform, deviceType"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}404Couldn’t find a device type with the specified deviceType description.
Body
{
"error": {
"message": "Device type could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}409Some other device with this MAC address already exists.
Body
{
"error": {
"message": "A device with this address already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Device ¶
Get a single deviceGET/api/v1/devices/{deviceId}
Example URI
- deviceId
integer(required) Example: 2Unique identifier for a device.
200Get device details.
Body
{
"data": {
"firmware": {
"href": "https://localhost:3000/api/v1/firmware/2.7.1"
},
"addr": "aabbcc",
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
},
"platform": "RF200",
"upgrading": false,
"description": "test",
"deviceType": "Deck1",
"id": 2,
"href": "https://localhost:3000/api/v1/devices/2"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
},
"description": "Firmware on device"
},
"addr": {
"pattern_description": "A valid SNAP address must be a hex value of at least 6 digits with optional period or colon delimiters (ex: a18ca9, 04:3E:82).",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "Device MAC address"
},
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this image resource"
}
},
"description": "Software on device"
},
"platform": {
"type": "string",
"description": "Hardware platform"
},
"upgrading": {
"type": "boolean",
"description": "Indicates whether device is upgrading"
},
"description": {
"type": "string",
"description": "User defined name for the device"
},
"deviceType": {
"type": "string",
"description": "Device type"
},
"id": {
"type": "integer",
"description": "Unique identifier for this device"
},
"href": {
"type": "string",
"description": "URI for this device resource"
}
}
}
}
}404No device found for this identifier.
Body
{
"error": {
"message": "Device could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Update DevicePUT/api/v1/devices/{deviceId}
Example URI
- deviceId
integer(required) Example: 2Unique identifier for a device.
Body
{
"deviceType": "Deck1",
"addr": "ccddee",
"platform": "RF200",
"description": "Device1"
}Schema
{
"type": "object",
"title": "Update device",
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"deviceType": {
"type": "string",
"description": "The type of device. This must exist in the database already."
},
"addr": {
"pattern_description": "A valid SNAP Address must be a hex value of at least 6 digits with optional period or colon delimiters (ex:\"a18ca9\", \"04:3E:82\").",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"platform": {
"type": "string",
"description": "The device platform (ex: RF200)"
},
"description": {
"type": "string",
"description": "Description of the device"
}
},
"description": "A device"
}200Successfully updated device.
Headers
Content-Type: application/jsonBody
{
"data": {
"firmware": {
"href": "Unknown"
},
"addr": "ccddee",
"image": {
"href": "Unknown"
},
"platform": "RF200",
"upgrading": false,
"description": "Device1",
"deviceType": "Deck1",
"id": 6,
"href": "https://localhost:3000/api/v1/devices/6"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
},
"description": "Firmware of device"
},
"addr": {
"type": "string",
"description": "Address of device"
},
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this image resource"
}
},
"description": "Image of device"
},
"platform": {
"type": "string",
"description": "Type of platform"
},
"upgrading": {
"type": "boolean",
"description": "Indicates whether device is upgrading"
},
"description": {
"type": "string",
"description": "Description of device"
},
"deviceType": {
"type": "string",
"description": "Type of device"
},
"id": {
"type": "integer",
"description": "Unique identifier for device"
},
"href": {
"type": "string",
"description": "URI for this device resource"
}
}
}
}
}400Can’t update this device because required device properties are missing.
Body
{
"error": {
"message": "The following properties are required: addr, description, platform, deviceType"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}404No device found for this identifier, or couldn’t find a device type with the specified deviceType description.
Body
{
"error": {
"message": "Device could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}409Can’t update this device’s address to the specified address, because that address is assigned to some other device in the system.
Body
{
"error": {
"message": "A device with this address already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Delete DeviceDELETE/api/v1/devices/{deviceId}
Example URI
- deviceId
integer(required) Example: 2Unique identifier for a device.
204Successfully deleted device.
404No device found for this identifier.
Body
{
"error": {
"message": "Device could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Device Batches ¶
Batch Device Operations ¶
Create a Batch of DevicesPOST/api/v1/devices/batches
Use this endpoint to efficiently create a large number of Device resources.
Example URI
Body
{
"devices": [
{
"deviceType": "Deck1",
"addr": "60866a",
"platform": "RF200",
"description": "Device1"
},
{
"deviceType": "Deck1",
"addr": "608477",
"platform": "RF200",
"description": "Device2"
}
]
}Schema
{
"title": "Add batch of devices",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "Batch of devices",
"required": [
"devices"
],
"properties": {
"devices": {
"items": {
"required": [
"addr",
"description",
"platform",
"deviceType"
],
"type": "object",
"properties": {
"deviceType": {
"description": "The type of device. This must exist in the database already.",
"type": "string",
"minLength": 1
},
"addr": {
"pattern_description": "A valid SNAP Address must be a hex value of at least 6 digits with optional period or colon delimiters (ex:\"a18ca9\", \"04:3E:82\").",
"description": "SNAP MAC address",
"type": "string",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$"
},
"platform": {
"description": "The device platform (ex: RF200)",
"type": "string",
"minLength": 1
},
"description": {
"description": "Description of the device",
"type": "string",
"minLength": 1
}
}
},
"type": "array"
}
}
}201Successfully created devices.
Headers
Content-Type: application/json
Location: https://localhost:3000/api/v1/devices/batches/b38baa5f-ce28-41a3-9bdd-4a14934e826cBody
{
"data": {
"devices": [
{
"firmware": {
"href": "Unknown"
},
"addr": "60866a",
"image": {
"href": "Unknown"
},
"platform": "RF200",
"upgrading": false,
"description": "Device1",
"deviceType": "Deck1",
"id": 6,
"href": "https://localhost:3000/api/v1/devices/6"
},
{
"firmware": {
"href": "Unknown"
},
"addr": "608477",
"image": {
"href": "Unknown"
},
"platform": "RF200",
"upgrading": false,
"description": "Device2",
"deviceType": "Deck1",
"id": 7,
"href": "https://localhost:3000/api/v1/devices/7"
}
],
"href": "https://localhost:3000/api/v1/devices/batches/b38baa5f-ce28-41a3-9bdd-4a14934e826c"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"devices": {
"items": {
"type": "object",
"properties": {
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
}
},
"addr": {
"type": "string",
"description": "Address of device"
},
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this image resource"
}
}
},
"platform": {
"type": "string",
"description": "Type of platform"
},
"upgrading": {
"type": "boolean",
"description": "Indicates whether device is upgrading"
},
"description": {
"type": "string",
"description": "Description of device"
},
"deviceType": {
"type": "string",
"description": "Type of device"
},
"id": {
"type": "integer",
"description": "Unique identifier for device"
},
"href": {
"type": "string",
"description": "URI for this device resource"
}
}
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this batch of devices"
}
}
}
}
}400Can’t create one or more devices because required device properties are missing.
Body
{
"error": {
"message": "The following properties are required: addr, description, platform, deviceType"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}404Couldn’t find a device type with the specified deviceType description.
Body
{
"error": {
"message": "Device type could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}409Some other device with this MAC address already exists.
Body
{
"error": {
"message": "A device with this address already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Device Types ¶
Device Types Collection ¶
Get list of device typesGET/api/v1/deviceTypes
Example URI
200List all device types.
Headers
Content-Type: application/jsonBody
{
"data": [
{
"id": 1,
"description": "Some Device Type",
"href": "https://localhost:3000/api/v1/deviceTypes/"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for this device type"
},
"description": {
"type": "string",
"description": "Name of device type"
},
"href": {
"type": "string",
"description": "URI for this device type resource"
}
}
},
"type": "array"
}
}
}Create device typePOST/api/v1/deviceTypes
Example URI
Body
{
"description": "Some Device Type"
}Schema
{
"properties": {
"description": {
"description": "A unique device type",
"type": "string",
"minLength": 1
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A device type",
"required": [
"description"
],
"title": "Add device type"
}201Successfully created device type.
Headers
Content-Type: application/json
Location: https://localhost:3000/api/v1/deviceTypes/1Body
{
"data": {
"id": 1,
"description": "Some Device Type",
"href": "https://localhost:3000/api/v1/deviceTypes/1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for this device type"
},
"description": {
"type": "string",
"description": "Name of device type"
},
"href": {
"type": "string",
"description": "URI for this device type resource"
}
}
}
}
}409A device type with this description already exists.
Body
{
"error": {
"message": "A device type with this description already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Device Type ¶
Get a single device typeGET/api/v1/deviceTypes/{deviceTypeId}
Example URI
- deviceTypeId
integer(required) Example: 1Unique identifier for a device type.
200Get device type details.
Body
{
"data": [
{
"id": 1,
"description": "Some Device Type",
"href": "https://localhost:3000/api/v1/deviceTypes/1"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for this device type"
},
"description": {
"type": "string",
"description": "Name of device type"
},
"href": {
"type": "string",
"description": "URI for this device type resource"
}
}
},
"type": "array"
}
}
}Update device typePUT/api/v1/deviceTypes/{deviceTypeId}
Example URI
- deviceTypeId
integer(required) Example: 1Unique identifier for a device type.
Body
{
"description": "Some Device Type"
}Schema
{
"properties": {
"description": {
"description": "Type of device",
"type": "string",
"minLength": 1
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A device type",
"required": [
"description"
],
"title": "Update device type"
}200Successfully updated device type.
Headers
Content-Type: application/jsonBody
{
"data": {
"id": 1,
"description": "Some Device Type",
"href": "https://localhost:3000/api/v1/deviceTypes/1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for this device type"
},
"description": {
"type": "string",
"description": "Name of device type"
},
"href": {
"type": "string",
"description": "URI for this device type resource"
}
}
}
}
}404No device type found for this identifier.
Body
{
"error": {
"message": "Device type could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}409Some other device type with this description already exists.
Body
{
"error": {
"message": "A device type with this description already exists"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Delete device typeDELETE/api/v1/deviceTypes/{deviceTypeId}
Example URI
- deviceTypeId
integer(required) Example: 1Unique identifier for a device type.
204Successfully deleted device type.
404No device type found for this identifier.
Body
{
"error": {
"message": "Device type could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Firmware ¶
Firmware Collection ¶
The list of available firmware is determined by inspecting the SNAP firmware packages installed on your gateway; it does not necessarily correspond to all of the firmware currently available from Synapse Wireless.
Retrieve list of available firmwareGET/api/v1/firmware
Example URI
200List all firmware resources.Note that if no SNAP firmware is available, this will return an empty array.
Headers
Content-Type: application/jsonBody
{
"data": [
{
"version": "2.6.9",
"href": "https://localhost:3000/api/v1/firmware/2.6.9"
},
{
"version": "2.7.1",
"href": "https://localhost:3000/api/v1/firmware/2.7.1"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"version": {
"type": "string",
"description": "Firmware version number"
},
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
},
"description": "A SNAP firmware release"
},
"type": "array"
}
}
}Firmware ¶
Retrieve specific firmware resourceGET/api/v1/firmware/{firmwareVersion}
Example URI
- firmwareVersion
string(required) Example: 2.7.1Unique identifier for a firmware version.
200Get firmware resource details.
Body
{
"data": {
"version": "2.7.1",
"href": "https://localhost:3000/api/v1/firmware/2.7.1"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"version": {
"type": "string",
"description": "Firmware version number"
},
"href": {
"type": "string",
"description": "URI for this firmware resource"
}
},
"description": "A SNAP firmware release"
}
}
}404There is no available firmware corresponding to this firmware version number.
Body
{
"error": {
"message": "Firmware could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}License ¶
License ¶
Apply a LicensePUT/api/v1/license
The license needs to be Base64-encoded before it can be uploaded to SNAP Thing Services.
Please contact Synapse Customer Service to receive a license. A license gives you access to bulk upgrades, data collection with no node limit, and topology generation with no node limit.
Example URI
200Successfully applied SNAP Thing Services License
Delete the licenseDELETE/api/v1/license
Example URI
204The license was successfully deleted.
License Capabilities ¶
Get license capabilitiesGET/api/v1/licenseCapabilities
Example URI
200Get current license details.
Headers
Content-Type: application/jsonBody
{
"data": {
"actuation": true,
"siteDirector": true,
"dataCollector": true,
"siteDoctor": true,
"types": [
"manage",
"deploy"
],
"expiration": "2020-02-05",
"customer": "John Smith"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"actuation": {
"type": "boolean",
"description": "True if Actuation is licensed"
},
"siteDirector": {
"type": "boolean",
"description": "True if the Site Director is licensed"
},
"dataCollector": {
"type": "boolean",
"description": "True if the Data Collector is licensed"
},
"siteDoctor": {
"type": "boolean",
"description": "True if the Site Doctor is licensed"
},
"types": {
"items": {
"type": "string",
"description": "License types"
},
"type": "array"
},
"expiration": {
"type": "string",
"description": "The date the license expires"
},
"customer": {
"type": "string",
"description": "The licensed customer"
}
}
}
}
}Site Configuration ¶
Import Site Configuration ¶
Get site configurationGET/api/v1/siteConfig
Example URI
200Returns an exported site configuration.
Body
{
"data": {
"deviceTypes": [
{
"description": "a device type description"
},
{
"description": "another device type description"
}
],
"version": 2,
"dataCollectors": [
{
"deviceTypes": [
"sensors"
],
"dataCollectorType": "asynchronous",
"initRpcName": "setReceiverAddress",
"name": "dc1",
"dataRpcName": "acceptData"
},
{
"pollInterval": 60,
"deviceTypes": [
"lights"
],
"dataCollectorType": "synchronous",
"queryFunction": "data",
"name": "dc2"
}
],
"images": [
{
"id": "46fed882-98da-497f-8400-9c92f4c66bb0",
"file": "/d9CprNlBqsxQ8oJ+23SCfkIrXOaoUIaxHNoVK5xo3FLuS9uDXBRO1ommFU6wmMvssqK13qPGMFBe7gc/IaZY8c6fK0KnAgY/WPZWAsQGi1xDP+L7hoi8J0lts3BCJ1czjzCE9y4H176wcKqyezON3FW/0HvYJG9WpgR18eKFe6mW3ylE5QAltxIQG8jQBlXsOU82J7G8mdsds9prCbC8A2Vqiekmgza4Q7l6MnStBilePZxqhYipsWnifMiq4UsHatKcnfZd7ohnf49wQLMS8h1t3R/WYcYfJy7VSso8g6wJ8K5LRv1l3AH1qE9ohJERfc7C1aWAq/ApYIVTBxcFt6yuytjskB1QWoXoQ6l+9qmR//H8KiQbWcw6D/j5FBW61Py1ZHU45r66FSP1FeqjCv9dwGx5qkF9OSM0g9bsObdahldQ1nS1xdV+Zg/RkVSAeeMmrFqg3tTPLslRbckDW6kj/F/KZaiqrAjjK25REMjcEv9aRg8lBiwqvxLcAev6Kd3KKH27rlqH3WhbrYBe4AUFw7kNgjPQ3gIX8jf0HJOl3PZO32FuJksQfjvO7xW94sXC0BUbXrszZ+WDKMY4rmN2YGHflE9L+yChq/DpKSuG2eahqLb915osWahSDd2RQ27aQ3SDXwd8jKwAjpxKR0FWxp8yLDgoIUFJwWJBjyun+4f+qXLE5Zvz1B1z6f06I+VMwQWjNMPo9JeA5iuyL5O+wVYDlpBsoUnY38Vsw6vLYmQNb8nnGfo1Sonu5W9O3gUTVNKVDB6F4qJLDLCgVVWXdmJGvC8qVg3n+ggbT/5yiMh6nmaLeqLMPZZViMn52jAVbIJQvcWTvttUwdH9Qpf3m7aJdpP834XPcvnrWSBg4TyOdG/M5SyJFFXDIgFQNsj6UoGEqADDi9pB1eAO/iwGGB7tciD4x/yrkHgqMd0XJPDOVZzr1h2v7IHhOtbh3szXcaGJNTwMqiwC6ihtgips1MJahpaky73VUDMWcnggoaTSOOJvEPZ8SNhgyec0wj6UhpDp9uJYbdxWFcf8ad97l9EesoyfOzIbyoS7SqpFDS/+JZFvb7MaZV8v3AQkJkr/SWs74vz3Nng6rbF8IANK7yDuoEf8LmwwZJtbXoCaZmsERt73ZprdRWztDX4n7PdF/7mJ37yVg/W4+2vPm8FqQ5BE1BwcgwTNd7/QJyhNTcNvm/BDIgZ4o/78KhQUxRsiBP85ck2WcvDf9hKlS+xixom7qY4PazAVWMRhvefg99ANuj1r3o38sTMlYOf",
"size": 3489,
"name": "MCastCounter",
"crc": "0xda95"
},
{
"id": "12abc882-98da-497f-8400-9c92f4c66bb0",
"file": "/d9CprNlBqsxQ8oJ+23SCfkIrXOaoUIaxHNoVK5xo3FLuS9uDXBRO1ommFU6wmMvssqK13qPGMFBe7gc/IaZY8c6fK0KnAgY/WPZWAsQGi1xDP+L7hoi8J0lts3BCJ1czjzCE9y4H176wcKqyezON3FW/0HvYJG9WpgR18eKFe6mW3ylE5QAltxIQG8jQBlXsOU82J7G8mdsds9prCbC8A2Vqiekmgza4Q7l6MnStBilePZxqhYipsWnifMiq4UsHatKcnfZd7ohnf49wQLMS8h1t3R/WYcYfJy7VSso8g6wJ8K5LRv1l3AH1qE9ohJERfc7C1aWAq/ApYIVTBxcFt6yuytjskB1QWoXoQ6l+9qmR//H8KiQbWcw6D/j5FBW61Py1ZHU45r66FSP1FeqjCv9dwGx5qkF9OSM0g9bsObdahldQ1nS1xdV+Zg/RkVSAeeMmrFqg3tTPLslRbckDW6kj/F/KZaiqrAjjK25REMjcEv9aRg8lBiwqvxLcAev6Kd3KKH27rlqH3WhbrYBe4AUFw7kNgjPQ3gIX8jf0HJOl3PZO32FuJksQfjvO7xW94sXC0BUbXrszZ+WDKMY4rmN2YGHflE9L+yChq/DpKSuG2eahqLb915osWahSDd2RQ27aQ3SDXwd8jKwAjpxKR0FWxp8yLDgoIUFJwWJBjyun+4f+qXLE5Zvz1B1z6f06I+VMwQWjNMPo9JeA5iuyL5O+wVYDlpBsoUnY38Vsw6vLYmQNb8nnGfo1Sonu5W9O3gUTVNKVDB6F4qJLDLCgVVWXdmJGvC8qVg3n+ggbT/5yiMh6nmaLeqLMPZZViMn52jAVbIJQvcWTvttUwdH9Qpf3m7aJdpP834XPcvnrWSBg4TyOdG/M5SyJFFXDIgFQNsj6UoGEqADDi9pB1eAO/iwGGB7tciD4x/yrkHgqMd0XJPDOVZzr1h2v7IHhOtbh3szXcaGJNTwMqiwC6ihtgips1MJahpaky73VUDMWcnggoaTSOOJvEPZ8SNhgyec0wj6UhpDp9uJYbdxWFcf8ad97l9EesoyfOzIbyoS7SqpFDS/+JZFvb7MaZV8v3AQkJkr/SWs74vz3Nng6rbF8IANK7yDuoEf8LmwwZJtbXoCaZmsERt73ZprdRWztDX4n7PdF/7mJ37yVg/W4+2vPm8FqQ5BE1BwcgwTNd7/QJyhNTcNvm/BDIgZ4o/78KhQUxRsiBP85ck2WcvDf9hKlS+xixom7qY4PazAVWMRhvefg99ANuj1r3o38sTMlYOf",
"size": 2785,
"name": "BlinkLED",
"crc": "0xda95"
}
],
"actuationEnabled": true
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"deviceTypes": {
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"description": "Name of device type"
}
}
},
"type": "array"
},
"version": {
"type": "integer",
"description": "The site configuration schema version"
},
"dataCollectors": {
"items": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Name of data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
},
"type": "array"
},
"images": {
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this SPY image resource"
},
"file": {
"type": "string",
"description": "SPY image content"
},
"size": {
"type": "integer",
"description": "Image size in bytes"
},
"name": {
"type": "string",
"description": "The script name compiled into the SPY image"
},
"crc": {
"type": "string",
"description": "Checksum of SPY image content"
}
}
},
"type": "array"
},
"actuationEnabled": {
"type": "boolean",
"description": "True if actuation is permitted for the system, false otherwise"
}
}
}
}
}Import site configurationPOST/api/v1/siteConfig
Example URI
Body
{}Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"required": [
"deviceTypes",
"dataCollectors",
"images",
"actuationEnabled"
],
"type": "object",
"properties": {
"deviceTypes": {
"description": {
"type": "object",
"description": "Device types"
}
},
"version": {
"type": "integer",
"description": "The site configuration schema version"
},
"dataCollectors": {
"description": {
"type": "object",
"description": "Data collectors"
}
},
"images": {
"description": {
"type": "object",
"description": "Images"
}
},
"actuationEnabled": {
"type": "boolean",
"description": "True if actuation is permitted for the system, false otherwise"
}
}
}201The site configuration was successfully imported.
Body
{
"deviceTypes": [
{
"description": "a device type description"
},
{
"description": "another device type description"
}
],
"version": 2,
"dataCollectors": [
{
"deviceTypes": [
"sensors"
],
"dataCollectorType": "asynchronous",
"initRpcName": "setReceiverAddress",
"name": "dc1",
"dataRpcName": "acceptData"
},
{
"pollInterval": 60,
"deviceTypes": [
"lights"
],
"dataCollectorType": "synchronous",
"queryFunction": "data",
"name": "dc2"
}
],
"images": [
{
"id": "46fed882-98da-497f-8400-9c92f4c66bb0",
"file": "/d9CprNlBqsxQ8oJ+23SCfkIrXOaoUIaxHNoVK5xo3FLuS9uDXBRO1ommFU6wmMvssqK13qPGMFBe7gc/IaZY8c6fK0KnAgY/WPZWAsQGi1xDP+L7hoi8J0lts3BCJ1czjzCE9y4H176wcKqyezON3FW/0HvYJG9WpgR18eKFe6mW3ylE5QAltxIQG8jQBlXsOU82J7G8mdsds9prCbC8A2Vqiekmgza4Q7l6MnStBilePZxqhYipsWnifMiq4UsHatKcnfZd7ohnf49wQLMS8h1t3R/WYcYfJy7VSso8g6wJ8K5LRv1l3AH1qE9ohJERfc7C1aWAq/ApYIVTBxcFt6yuytjskB1QWoXoQ6l+9qmR//H8KiQbWcw6D/j5FBW61Py1ZHU45r66FSP1FeqjCv9dwGx5qkF9OSM0g9bsObdahldQ1nS1xdV+Zg/RkVSAeeMmrFqg3tTPLslRbckDW6kj/F/KZaiqrAjjK25REMjcEv9aRg8lBiwqvxLcAev6Kd3KKH27rlqH3WhbrYBe4AUFw7kNgjPQ3gIX8jf0HJOl3PZO32FuJksQfjvO7xW94sXC0BUbXrszZ+WDKMY4rmN2YGHflE9L+yChq/DpKSuG2eahqLb915osWahSDd2RQ27aQ3SDXwd8jKwAjpxKR0FWxp8yLDgoIUFJwWJBjyun+4f+qXLE5Zvz1B1z6f06I+VMwQWjNMPo9JeA5iuyL5O+wVYDlpBsoUnY38Vsw6vLYmQNb8nnGfo1Sonu5W9O3gUTVNKVDB6F4qJLDLCgVVWXdmJGvC8qVg3n+ggbT/5yiMh6nmaLeqLMPZZViMn52jAVbIJQvcWTvttUwdH9Qpf3m7aJdpP834XPcvnrWSBg4TyOdG/M5SyJFFXDIgFQNsj6UoGEqADDi9pB1eAO/iwGGB7tciD4x/yrkHgqMd0XJPDOVZzr1h2v7IHhOtbh3szXcaGJNTwMqiwC6ihtgips1MJahpaky73VUDMWcnggoaTSOOJvEPZ8SNhgyec0wj6UhpDp9uJYbdxWFcf8ad97l9EesoyfOzIbyoS7SqpFDS/+JZFvb7MaZV8v3AQkJkr/SWs74vz3Nng6rbF8IANK7yDuoEf8LmwwZJtbXoCaZmsERt73ZprdRWztDX4n7PdF/7mJ37yVg/W4+2vPm8FqQ5BE1BwcgwTNd7/QJyhNTcNvm/BDIgZ4o/78KhQUxRsiBP85ck2WcvDf9hKlS+xixom7qY4PazAVWMRhvefg99ANuj1r3o38sTMlYOf",
"size": 3489,
"name": "MCastCounter",
"crc": "0xda95"
},
{
"id": "12abc882-98da-497f-8400-9c92f4c66bb0",
"file": "/d9CprNlBqsxQ8oJ+23SCfkIrXOaoUIaxHNoVK5xo3FLuS9uDXBRO1ommFU6wmMvssqK13qPGMFBe7gc/IaZY8c6fK0KnAgY/WPZWAsQGi1xDP+L7hoi8J0lts3BCJ1czjzCE9y4H176wcKqyezON3FW/0HvYJG9WpgR18eKFe6mW3ylE5QAltxIQG8jQBlXsOU82J7G8mdsds9prCbC8A2Vqiekmgza4Q7l6MnStBilePZxqhYipsWnifMiq4UsHatKcnfZd7ohnf49wQLMS8h1t3R/WYcYfJy7VSso8g6wJ8K5LRv1l3AH1qE9ohJERfc7C1aWAq/ApYIVTBxcFt6yuytjskB1QWoXoQ6l+9qmR//H8KiQbWcw6D/j5FBW61Py1ZHU45r66FSP1FeqjCv9dwGx5qkF9OSM0g9bsObdahldQ1nS1xdV+Zg/RkVSAeeMmrFqg3tTPLslRbckDW6kj/F/KZaiqrAjjK25REMjcEv9aRg8lBiwqvxLcAev6Kd3KKH27rlqH3WhbrYBe4AUFw7kNgjPQ3gIX8jf0HJOl3PZO32FuJksQfjvO7xW94sXC0BUbXrszZ+WDKMY4rmN2YGHflE9L+yChq/DpKSuG2eahqLb915osWahSDd2RQ27aQ3SDXwd8jKwAjpxKR0FWxp8yLDgoIUFJwWJBjyun+4f+qXLE5Zvz1B1z6f06I+VMwQWjNMPo9JeA5iuyL5O+wVYDlpBsoUnY38Vsw6vLYmQNb8nnGfo1Sonu5W9O3gUTVNKVDB6F4qJLDLCgVVWXdmJGvC8qVg3n+ggbT/5yiMh6nmaLeqLMPZZViMn52jAVbIJQvcWTvttUwdH9Qpf3m7aJdpP834XPcvnrWSBg4TyOdG/M5SyJFFXDIgFQNsj6UoGEqADDi9pB1eAO/iwGGB7tciD4x/yrkHgqMd0XJPDOVZzr1h2v7IHhOtbh3szXcaGJNTwMqiwC6ihtgips1MJahpaky73VUDMWcnggoaTSOOJvEPZ8SNhgyec0wj6UhpDp9uJYbdxWFcf8ad97l9EesoyfOzIbyoS7SqpFDS/+JZFvb7MaZV8v3AQkJkr/SWs74vz3Nng6rbF8IANK7yDuoEf8LmwwZJtbXoCaZmsERt73ZprdRWztDX4n7PdF/7mJ37yVg/W4+2vPm8FqQ5BE1BwcgwTNd7/QJyhNTcNvm/BDIgZ4o/78KhQUxRsiBP85ck2WcvDf9hKlS+xixom7qY4PazAVWMRhvefg99ANuj1r3o38sTMlYOf",
"size": 2785,
"name": "BlinkLED",
"crc": "0xda95"
}
],
"actuationEnabled": true
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"deviceTypes": {
"items": {
"type": "object",
"properties": {
"description": {
"type": "string",
"description": "Name of device type"
}
}
},
"type": "array"
},
"dataCollectors": {
"items": {
"type": "object",
"properties": {
"pollInterval": {
"type": "integer",
"description": "Number of seconds between polls (sync only)"
},
"queryFunction": {
"type": "string",
"description": "Name of query function (sync only)"
},
"initRpcName": {
"type": "string",
"description": "Name of function implemented by SNAPpy script (async only)"
},
"deviceTypes": {
"items": {
"type": "string",
"description": "Description of device type"
},
"type": "array"
},
"dataCollectorType": {
"type": "string",
"description": "Data collector type, one of 'synchronous' or 'asynchronous'"
},
"dataRpcName": {
"type": "string",
"description": "Name of the RPC that the receiver will listen on for new data (async only)"
},
"name": {
"type": "string",
"description": "Name of data collector"
},
"href": {
"type": "string",
"description": "URI for this data collector resource"
}
}
},
"type": "array"
},
"images": {
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this SPY image resource"
},
"crc": {
"type": "string",
"description": "Checksum of SPY image content"
},
"size": {
"type": "integer",
"description": "Image size in bytes"
},
"name": {
"type": "string",
"description": "The script name compiled into the SPY image"
},
"href": {
"type": "string",
"description": "URI for this SPY image resource"
}
}
},
"type": "array"
},
"actuationEnabled": {
"type": "boolean",
"description": "True if actuation is permitted for the system, false otherwise"
}
}
}
}
}400Site configuration could not be imported with these attributes.
Body
{
"error": {
"message": "Site configuration could not be imported with these attributes"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}SPY Images ¶
SPY Image Collection ¶
Get all SPY imagesGET/api/v1/images
Example URI
200List all images.If no SPY images have been uploaded, the response contains an empty array.
Body
{
"data": [
{
"id": "6f992502-33f0-47d4-a01e-973593e1915d",
"crc": "0xda95",
"size": 3489,
"name": "McastCounter",
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
},
{
"id": "f97fdf18-fede-4d58-96d4-eb3f36b4b872",
"crc": "0x16f1",
"size": 690,
"name": "blink",
"href": "https://localhost:3000/api/v1/images/f97fdf18-fede-4d58-96d4-eb3f36b4b872"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this SPY image resource"
},
"id": {
"type": "string",
"description": "Unique identifier for this SPY image resource"
},
"size": {
"type": "integer",
"description": "Image size in bytes"
},
"name": {
"type": "string",
"description": "The script name compiled into the SPY image"
},
"crc": {
"type": "string",
"description": "Checksum of SPY image content"
}
}
},
"type": "array"
}
}
}Create a new SPY imagePOST/api/v1/images
You must create a SPY image resource in the service before it can be uploaded to a SNAP device.
To create a SPY image resource, obtain the Base64-encoded representation of the SPY image data
and pass it in as the content property’s value for this request.
Example URI
Body
{
"content": "<Base64-encoded SPY file contents>"
}Schema
{
"properties": {
"content": {
"media": {
"binaryEncoding": "base64",
"type": "octet-stream"
},
"type": "string",
"description": "Base64-encoded SPY image contents"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A SPY file image",
"required": [
"content"
],
"title": "Upload SPY image"
}201Successfully created image.
Headers
Location: https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915dBody
{
"data": {
"id": "6f992502-33f0-47d4-a01e-973593e1915d",
"crc": "0xda95",
"size": 3489,
"name": "McastCounter",
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this SPY image resource"
},
"id": {
"type": "string",
"description": "Unique identifier for this SPY image resource"
},
"size": {
"type": "integer",
"description": "Image size in bytes"
},
"name": {
"type": "string",
"description": "The script name compiled into the SPY image"
},
"crc": {
"type": "string",
"description": "Checksum of SPY image content"
}
}
}
}
}Delete all SPY imagesDELETE/api/v1/images
Example URI
204Successfully deleted all images.
SPY Image ¶
Get a single SPY imageGET/api/v1/images/{imageId}
Example URI
- imageId
string(required) Example: 6f992502-33f0-47d4-a01e-973593e1915dUnique identifier for a SPY image.
200Get image details.
Body
{
"data": {
"id": "6f992502-33f0-47d4-a01e-973593e1915d",
"crc": "0xda95",
"size": 3489,
"name": "McastCounter",
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "URI for this SPY image resource"
},
"id": {
"type": "string",
"description": "Unique identifier for this SPY image resource"
},
"size": {
"type": "integer",
"description": "Image size in bytes"
},
"name": {
"type": "string",
"description": "The script name compiled into the SPY image"
},
"crc": {
"type": "string",
"description": "Checksum of SPY image content"
}
}
},
"type": "array"
}
}
}404No SPY image found for this identifier.
Body
{
"error": {
"message": "Image could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Delete a SPY imageDELETE/api/v1/images/{imageId}
Example URI
- imageId
string(required) Example: 6f992502-33f0-47d4-a01e-973593e1915dUnique identifier for a SPY image.
204Successfully deleted image.
404No SPY image found for this identifier.
Body
{
"error": {
"message": "Image could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Synapse RF Module Types ¶
Synapse RF Module Type Collection ¶
Get Module TypesGET/api/v1/moduleTypes
Example URI
200List all Synapse RF module types.
Body
{
"data": [
{
"partName": "RF200PF1",
"href": "https://localhost:3000/api/v1/moduleTypes/RF200PF1"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"partName": {
"type": "string",
"description": "Synapse RF Module Type Part Name"
},
"href": {
"type": "string",
"description": "URI for this Synapse RF Module Type"
}
}
},
"type": "array"
}
}
}Network Configuration ¶
Network Configurations Collection ¶
Get a List of All Network ConfigurationsGET/api/v1/networkConfigurations
Example URI
200List all network configurations.
Body
{
"data": [
{
"id": "7e968754-78f0-09f8-b57b-968745b2789e",
"deviceGroupConfigurations": [
{
"devices": [
"03cd71",
"04ab44"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}
},
{
"devices": [
"00a400",
"040128"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/4a2fd398-3a66-49c0-9126-98c901cd6ee4"
}
}
}
],
"href": "https://localhost:3000/api/v1/networkConfigurations/7e968754-78f0-09f8-b57b-968745b2789e"
},
{
"id": "c5fe2546-78f0-09f8-b57b-968745b2789e",
"deviceGroupConfigurations": [
{
"devices": [
"082614",
"7531df"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/4d271412-33f0-47d4-a01e-973593e1915d"
}
}
},
{
"devices": [
"04abaf",
"604def"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/9e524135-3a66-49c0-9126-98c901cd6ee4"
}
}
}
],
"href": "https://localhost:3000/api/v1/networkConfigurations/c5fe2546-78f0-09f8-b57b-968745b2789e"
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this network configuration resource"
},
"deviceGroupConfigurations": {
"items": {
"type": "object",
"properties": {
"devices": {
"items": {
"pattern_description": "A valid SNAP address must be a hex value of at least 6 digits with optional period or colon delimiters (ex: 'a18ca9', '04:3E:82').",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"type": "array",
"uniqueItems": true,
"description": "A group of devices"
},
"configuration": {
"type": "object",
"properties": {
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SPY image"
},
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SNAP firmware release"
}
},
"description": "A configuration that can be applied to one or more devices"
}
},
"description": "Associates a configuration with a group of devices"
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this network configuration resource"
}
},
"description": "A network configuration resource"
},
"type": "array"
}
}
}Create a Network ConfigurationPOST/api/v1/networkConfigurations
Describe a desired network configuration in terms of some number of device group-specific configurations.
Example URI
Body
{
"deviceGroupConfigurations": [
{
"devices": [
"03cd71",
"04ab44"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}
},
{
"devices": [
"00a400",
"040128"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/4a2fd398-3a66-49c0-9126-98c901cd6ee4"
}
}
}
]
}Schema
{
"properties": {
"deviceGroupConfigurations": {
"items": {
"required": [
"devices"
],
"type": "object",
"properties": {
"devices": {
"items": {
"pattern_description": "A valid SNAP Address must be a hex value of at least 6 digits with optional period or colon delimiters (ex:\"a18ca9\", \"04:3E:82\").",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"type": "array",
"uniqueItems": true,
"description": "A group of devices"
},
"configuration": {
"type": "object",
"properties": {
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SPY image"
},
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SNAP firmware release"
}
},
"description": "A configuration that can be applied to one or more devices"
}
},
"description": "Associates a configuration with a group of devices"
},
"type": "array"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A network configuration resource",
"required": [
"deviceGroupConfigurations"
],
"title": "Add network configuration"
}201Successfully created network configuration.
Headers
Location: https://localhost:3000/api/v1/networkConfigurations/7e968754-78f0-09f8-b57b-968745b2789eBody
{
"data": {
"id": "7e968754-78f0-09f8-b57b-968745b2789e",
"deviceGroupConfigurations": [
{
"devices": [
"03cd71",
"04ab44"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}
},
{
"devices": [
"00a400",
"040128"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/4a2fd398-3a66-49c0-9126-98c901cd6ee4"
}
}
}
],
"href": "https://localhost:3000/api/v1/networkConfigurations/7e968754-78f0-09f8-b57b-968745b2789e"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"required": [
"deviceGroupConfigurations"
],
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this network configuration resource"
},
"deviceGroupConfigurations": {
"items": {
"required": [
"devices"
],
"type": "object",
"properties": {
"devices": {
"items": {
"pattern_description": "A valid SNAP address must be a hex value of at least 6 digits with optional period or colon delimiters (ex: 'a18ca9', '04:3E:82').",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"type": "array",
"uniqueItems": true,
"description": "A group of devices"
},
"configuration": {
"type": "object",
"properties": {
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SPY image"
},
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SNAP firmware release"
}
},
"description": "A configuration that can be applied to one or more devices"
}
},
"description": "Associates a configuration with a group of devices"
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this network configuration resource"
}
},
"description": "A network configuration resource"
}
}
}Network Configuration ¶
Get a Network ConfigurationGET/api/v1/networkConfigurations/{networkConfigurationId}
Example URI
- networkConfigurationId
string(required) Example: 7e968754-78f0-09f8-b57b-968745b2789eUnique identifier for a network configuration resource.
200Get network configuration details.
Body
{
"data": {
"id": "7e968754-78f0-09f8-b57b-968745b2789e",
"deviceGroupConfigurations": [
{
"devices": [
"03cd71",
"04ab44"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/6f992502-33f0-47d4-a01e-973593e1915d"
}
}
},
{
"devices": [
"00a400",
"040128"
],
"configuration": {
"image": {
"href": "https://localhost:3000/api/v1/images/4a2fd398-3a66-49c0-9126-98c901cd6ee4"
}
}
}
],
"href": "https://localhost:3000/api/v1/networkConfigurations/7e968754-78f0-09f8-b57b-968745b2789e"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"required": [
"deviceGroupConfigurations"
],
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this network configuration resource"
},
"deviceGroupConfigurations": {
"items": {
"required": [
"devices"
],
"type": "object",
"properties": {
"devices": {
"items": {
"pattern_description": "A valid SNAP address must be a hex value of at least 6 digits with optional period or colon delimiters (ex: 'a18ca9', '04:3E:82').",
"pattern": "^(00[.:]?1[cC][.:]?2[cC][.:]?[0-9a-fA-F]{2}[.:]?[0-9a-fA-F]{2}[.:]?)?([0-9a-fA-F][.:]?){5}[0-9a-fA-F]$",
"type": "string",
"description": "SNAP MAC address"
},
"type": "array",
"uniqueItems": true,
"description": "A group of devices"
},
"configuration": {
"type": "object",
"properties": {
"image": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SPY image"
},
"firmware": {
"type": "object",
"properties": {
"href": {
"type": "string",
"description": "Location"
}
},
"description": "A SNAP firmware release"
}
},
"description": "A configuration that can be applied to one or more devices"
}
},
"description": "Associates a configuration with a group of devices"
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this network configuration resource"
}
},
"description": "A network configuration resource"
}
}
}404No network configuration resource found for this identifier.
Body
{
"error": {
"message": "Network configuration resource could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Network Configuration Updates ¶
Network Configuration Updates Collection ¶
Initiate a Network Configuration UpdatePOST/api/v1/networkConfigurationUpdates
A POST to this endpoint initiates a network configuration update, using the specified network configuration as the “recipe”. This is an asynchronous process that may take awhile to complete, so it immediately returns a 202 status (“Accepted”) and the location of a task resource that indicates the current status of this long-running update task.
Once a network configuration update is complete, the affected devices will be updated with their new firmware or script versions (assuming those updates were successful).
Example URI
Body
{
"href": "https://localhost:3000/api/v1/networkConfigurations/7e968754-78f0-09f8-b57b-968745b2789e"
}Schema
{
"title": "Apply a network configuration update",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A network configuration location",
"required": [
"href"
],
"properties": {
"href": {
"type": "string",
"description": "The location of a network configuration"
}
}
}202Accepted network configuration update for processing.
Headers
Location: https://localhost:3000/api/v1/tasks/8ba8d8bd-edeb-4960-bb05-87c75697bf6d400A network configuration update will not start if any number of errors are detected in the network configuration description (e.g. if the network configuration refers to unrecognized device MAC addresses). The message property of the error response should provide more details.
Body
{
"error": {
"message": "Unable to update network configuration: No devices found with address 608477"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}403A network configuration update will not start if the network configuration description identifies multiple devices but the user’s license restricts them to upgrading only one device at a time.
Body
{
"error": {
"message": "Your license only permits upgrading one device at a time. Please contact your sales representative to discuss upgrading your license to support upgrading multiple device at the same time."
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}404If the HREF in the message body refers to a non-existent network configuration, the response is 404 (Not Found).
Body
{
"error": {
"message": "Network configuration could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Network Configuration Updates ¶
Get results of a network configuration updateGET/api/v1/networkConfigurationUpdates/{networkConfigurationUpdateId}
Assuming the associated task of updating the network configuration is complete, this endpoint returns the results of that task. The results are group into firmware update results and image update results, on a device-by-device basis. If the attempted update of firmware or image for a device failed, the result value will be “failure”. If the update was successful, or if no update was attempted, the result value will be “success”.
Example URI
- networkConfigurationUpdateId
string(required) Example: 7e968754-78f0-09f8-b57b-968745b2789eUnique identifier for a network configuration update result.
200Get network configuration update results.
Body
{
"data": {
"id": "9496aed3-1614-4207-8883-2c807958d940",
"image_results": [
{
"result": "success",
"address": "60866a"
},
{
"result": "success",
"address": "608477"
}
],
"firmware_results": [
{
"result": "failure",
"address": "60866a"
},
{
"result": "success",
"address": "608477"
}
],
"href": "https://localhost:3000/api/v1/networkConfigurationUpdates/9496aed3-1614-4207-8883-2c807958d940"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this results set"
},
"image_results": {
"items": {
"type": "object",
"properties": {
"result": {
"type": "string",
"description": "Outcome of the attempted update, either success or failure"
},
"address": {
"type": "string",
"description": "MAC address for the device described in this result"
}
}
},
"type": "array"
},
"firmware_results": {
"items": {
"type": "object",
"properties": {
"result": {
"type": "string",
"description": "Outcome of the attempted update, either success or failure"
},
"address": {
"type": "string",
"description": "MAC address for the device described in this result"
}
}
},
"type": "array"
},
"href": {
"type": "string",
"description": "URI for this network configuration update results resource"
}
}
}
}
}404No such results.
Body
{
"error": {
"message": "Network configuration update results could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Sockets ¶
SockJS Endpoint ¶
Connect SockJSGET/ws
See http://sockjs.org for details on making a connection.
Example URI
200Body
"Established SockJS Connection"Tasks ¶
Task ¶
Get task statusGET/api/v1/tasks/{taskId}
A task resource is primarily useful as a handle for a long-running process,
such as updating the firmware on a group of devices, or computing the topology
for a SNAP mesh network.
If the response to a GET request for a task returns HTTP status 200 (OK),
the client can assume that this task is still in progress.
If the response to a GET request is HTTP status 303 (See Other),
the Location header of the response indicates the URI for the results of this
task. (Note that some HTTP clients will automatically redirect the client to this
location.)
Example URI
- taskId
string(required) Example: 7e968754-78f0-09f8-b57b-968745b2789eUnique identifier for a task.
200This long-running task (e.g. a network configuration update, or topology generation) is still in progress.
Body
{
"data": {
"id": "8ba8d8bd-edeb-4960-bb05-87c75697bf6d",
"href": "https://localhost:3000/api/v1/tasks/8ba8d8bd-edeb-4960-bb05-87c75697bf6d"
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for this task"
},
"href": {
"type": "string",
"description": "URI of this task resource"
}
}
}
}
}303This task is complete, and the Location header indicates where to find the results of this task.
Headers
Location: https://localhost:3000/api/v1/networkConfigurationUpdates/9496aed3-1614-4207-8883-2c807958d940404No task found for this identifier.
Body
{
"error": {
"message": "Task could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}TCP Access ¶
TCP Access ¶
Handles requests to enable or disable SNAPconnect TCP access.
Get TCP access stateGET/api/v1/tcpAccess
Example URI
200Get TCP access details.
Body
{
"data": {
"tcpAccessEnabled": true
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"tcpAccessEnabled": {
"type": "boolean",
"description": "Indicates whether TCP access is enabled"
}
}
}
}
}Enable TCP accessPOST/api/v1/tcpAccess
Example URI
Body
{
"username": "snap",
"password": "Synapse$0123"
}Schema
{
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "Username for the TCP connection"
},
"password": {
"minLength": 1,
"type": "string",
"description": "Password for the TCP connection"
}
},
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"description": "A device type",
"required": [
"username",
"password"
],
"title": "Add device type"
}201Successfully opened TCP connection
409TCP access has already been enabled.
Body
{
"error": {
"message": "TCP access has already been enabled"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Disable TCP accessDELETE/api/v1/tcpAccess
Disabling TCP access will prevent new connections but not close existing ones.
Example URI
204Successfully disabled TCP
Topologies ¶
SNAP Network Topology Collection ¶
Get all topologiesGET/api/v1/topologies
Returns an array of the previously generated topologies.
Topology results are limited to 5 nodes when using a trial license. Please contact your sales representative to discuss upgrading your license to support retrieving full topology results.
Example URI
200List all topologies.
Body
{
"data": [
{
"createdAt": "2016-07-27T13:57:43.361554Z",
"id": "525a2d06-bfa4-4ad5-b3a1-c614bc367d9c",
"href": "https://localhost:3000/api/v1/topologies/525a2d06-bfa4-4ad5-b3a1-c614bc367d9c",
"links": [
{
"end": "5ecad4",
"linkQuality": 71,
"start": "608509"
},
{
"end": "608509",
"linkQuality": 68,
"start": "5ecad4"
}
],
"gateways": [
"608509"
]
}
]
}Schema
{
"type": "object",
"properties": {
"data": {
"items": {
"type": "object",
"properties": {
"createdAt": {
"type": "string",
"description": "Topology creation date (ISO8601 format)"
},
"id": {
"type": "string",
"description": "Unique identifier for this topology resource"
},
"href": {
"type": "string",
"description": "URI for this topology resource"
},
"links": {
"items": {
"type": "object",
"properties": {
"end": {
"type": "string",
"description": "End address for this link"
},
"linkQuality": {
"type": "integer",
"description": "Link quality for this link (-dBm)"
},
"start": {
"type": "string",
"description": "Start address for this link"
}
}
},
"type": "array"
},
"gateways": {
"items": {
"type": "string",
"description": "Gateway MAC address"
},
"type": "array"
}
}
},
"type": "array"
}
}
}Initiate Generation of the SNAP Network TopologyPOST/api/v1/topologies
A POST to this endpoint initiates generation of the SNAP network topology. This is an asynchronous process that may take awhile to complete, depending on the number of nodes in your network, so it immediately returns a 202 status (“Accepted”) and the location of a task resource that indicates the current status of this long-running task. Clients can poll this task to determine when it has completed, and where to find the topology results.
Example URI
202Accepted topology for processing.
Headers
Location: https://localhost:3000/api/v1/tasks/83f4e242-e89d-407b-95e5-a5a603427217Delete all topologiesDELETE/api/v1/topologies
Delete from storage all previously generated topologies.
Example URI
204Successfully deleted all topologies.
SNAP Network Topology ¶
Get topologyGET/api/v1/topologies/{topologyId}
Returns information about this previously generated topology. The mesh network topology is represented in terms of an array of links, where each link is described by its starting and ending SNAP node address as well as the link quality (in -dBm) between those two nodes.
Note that because the link quality is reported in units of -dBm, small values of link quality (closer to zero) indicate high link quality, while larger values (e.g. greater than 80) indicate low link quality.
Topology results are limited to 5 nodes when using a trial license. Please contact your sales representative to discuss upgrading your license to support retrieving full topology results.
Example URI
- topologyId
string(required) Example: 525a2d06-bfa4-4ad5-b3a1-c614bc367d9cUnique identifier for a topology, or
latestto refer to the topology with the most recentcreatedAttimestamp.
200Get topology details.
Body
{
"data": {
"createdAt": "2016-07-27T13:57:43.361554Z",
"id": "525a2d06-bfa4-4ad5-b3a1-c614bc367d9c",
"href": "https://localhost:3000/api/v1/topologies/525a2d06-bfa4-4ad5-b3a1-c614bc367d9c",
"links": [
{
"end": "5ecad4",
"linkQuality": 71,
"start": "608509"
},
{
"end": "608509",
"linkQuality": 68,
"start": "5ecad4"
}
],
"gateways": [
"608509"
]
}
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"createdAt": {
"type": "string",
"description": "Topology creation date (ISO8601 format)"
},
"id": {
"type": "string",
"description": "Unique identifier for this topology resource"
},
"href": {
"type": "string",
"description": "URI for this topology resource"
},
"links": {
"items": {
"type": "object",
"properties": {
"end": {
"type": "string",
"description": "End address for this link"
},
"linkQuality": {
"type": "integer",
"description": "Link quality for this link (-dBm)"
},
"start": {
"type": "string",
"description": "Start address for this link"
}
}
},
"type": "array"
},
"gateways": {
"items": {
"type": "string",
"description": "Gateway MAC address"
},
"type": "array"
}
}
}
}
}404No device found for this identifier.
Body
{
"error": {
"message": "Topology could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Delete topologyDELETE/api/v1/topologies/{topologyId}
Delete the stored information about this previously generated topology.
Example URI
- topologyId
string(required) Example: 525a2d06-bfa4-4ad5-b3a1-c614bc367d9cUnique identifier for a topology, or
latestto refer to the topology with the most recentcreatedAttimestamp.
204Successfully deleted topology.
404No device found for this identifier.
Body
{
"error": {
"message": "Topology could not be found"
}
}Schema
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
}
}
}Topology Generation State ¶
Handles requests for topology generation currently in progress or not.
Get topology generation stateGET/api/v1/topologyInProgress
Example URI
200Successfully retrieved topology progress
Body
{
"data": true
}Schema
{
"type": "object",
"properties": {
"data": {
"type": "boolean",
"description": "Indicates whether topology generation is in progress"
}
}
}