For the base URL, authentication and errors, see the REST API overview.
GET /v1/users/{user}/products
- Request: GET /v1/users/{user}/products
- Operation: ListProducts
- Operation ID:
Product_List - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
POST /v1/users/{user}/products
- Request: POST /v1/users/{user}/products
- Operation: CreateProduct
- Operation ID:
Product_Create - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
config | object | no | Configuration schema for a product | |
config.fields | array of object | no | ||
config.fields[].icon | object | no | Icon schema for a product | |
config.fields[].icon.background | string | no | ||
config.fields[].icon.color | string | no | ||
config.fields[].icon.size | number | no | ||
config.fields[].icon.source | string | yes | ||
config.fields[].icon.type | string | yes | One of: fa, svg | Icon type: font-awesome or svg |
config.fields[].name | string | yes | Length: 1 to 255 | |
config.fields[].primary | boolean | no | ||
config.fields[].type | string | no | One of: string, number, date, time, datetime, timeago | |
config.fields[].value | string | yes | Length: 1 to 255 | |
config.icons | array of object | no | ||
config.icons[].conditions | array of object | no | ||
config.icons[].conditions[] | object | no | Variant 1: | |
config.icons[].conditions[].comparison | string | no | One of: above, below, equal, not_equal, inside, outside, present, absent | Variant 1: Comparison expressions for conditional evaluation. Every comparison but present / absent is false on a missing field. |
config.icons[].conditions[].field | string | no | Length: 1 to 255 | Variant 1: |
config.icons[].conditions[].operator | string | no | One of: and, or | Variant 1: Operator expressions for conditional evaluation |
config.icons[].conditions[].tag | string | no | Variant 1: | |
config.icons[].conditions[].value | string | yes | Length: 1 to 255 | Variant 1: |
config.icons[].conditions[] | object | no | Variant 2: | |
config.icons[].conditions[].comparison | string | no | One of: above, below, equal, not_equal, inside, outside, present, absent | Variant 2: Comparison expressions for conditional evaluation. Every comparison but present / absent is false on a missing field. |
config.icons[].conditions[].field | string | no | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].max | string | yes | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].min | string | yes | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].operator | string | no | One of: and, or | Variant 2: Operator expressions for conditional evaluation |
config.icons[].conditions[].tag | string | no | Variant 2: | |
config.icons[].icon | object | yes | Icon schema for a product | |
config.icons[].icon.background | string | no | ||
config.icons[].icon.color | string | no | ||
config.icons[].icon.size | number | no | ||
config.icons[].icon.source | string | yes | ||
config.icons[].icon.type | string | yes | One of: fa, svg | Icon type: font-awesome or svg |
config.type | string | no | One of: ``, thinremote | Product type that determines the device status view |
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
enabled | boolean | no | ||
name | string | yes | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
product | string | yes | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
profile | object | no | ||
services | object | no |
Example request (skeleton generated from the schema: required fields only, neutral values)
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"product": "",
"name": ""
}'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}
- Request: GET /v1/users/{user}/products/
- Operation: ReadProductConfig
- Operation ID:
Product_ReadConfig - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}
- Request: PUT /v1/users/{user}/products/
- Operation: UpdateProduct
- Operation ID:
Product_Update - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
config | object | no | Configuration schema for a product | |
config.fields | array of object | no | ||
config.fields[].icon | object | no | Icon schema for a product | |
config.fields[].icon.background | string | no | ||
config.fields[].icon.color | string | no | ||
config.fields[].icon.size | number | no | ||
config.fields[].icon.source | string | yes | ||
config.fields[].icon.type | string | yes | One of: fa, svg | Icon type: font-awesome or svg |
config.fields[].name | string | yes | Length: 1 to 255 | |
config.fields[].primary | boolean | no | ||
config.fields[].type | string | no | One of: string, number, date, time, datetime, timeago | |
config.fields[].value | string | yes | Length: 1 to 255 | |
config.icons | array of object | no | ||
config.icons[].conditions | array of object | no | ||
config.icons[].conditions[] | object | no | Variant 1: | |
config.icons[].conditions[].comparison | string | no | One of: above, below, equal, not_equal, inside, outside, present, absent | Variant 1: Comparison expressions for conditional evaluation. Every comparison but present / absent is false on a missing field. |
config.icons[].conditions[].field | string | no | Length: 1 to 255 | Variant 1: |
config.icons[].conditions[].operator | string | no | One of: and, or | Variant 1: Operator expressions for conditional evaluation |
config.icons[].conditions[].tag | string | no | Variant 1: | |
config.icons[].conditions[].value | string | yes | Length: 1 to 255 | Variant 1: |
config.icons[].conditions[] | object | no | Variant 2: | |
config.icons[].conditions[].comparison | string | no | One of: above, below, equal, not_equal, inside, outside, present, absent | Variant 2: Comparison expressions for conditional evaluation. Every comparison but present / absent is false on a missing field. |
config.icons[].conditions[].field | string | no | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].max | string | yes | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].min | string | yes | Length: 1 to 255 | Variant 2: |
config.icons[].conditions[].operator | string | no | One of: and, or | Variant 2: Operator expressions for conditional evaluation |
config.icons[].conditions[].tag | string | no | Variant 2: | |
config.icons[].icon | object | yes | Icon schema for a product | |
config.icons[].icon.background | string | no | ||
config.icons[].icon.color | string | no | ||
config.icons[].icon.size | number | no | ||
config.icons[].icon.source | string | yes | ||
config.icons[].icon.type | string | yes | One of: fa, svg | Icon type: font-awesome or svg |
config.type | string | no | One of: ``, thinremote | Product type that determines the device status view |
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
enabled | boolean | no | ||
name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
Example request (skeleton generated from the schema: required fields only, neutral values)
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{}'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
DELETE /v1/users/{user}/products/{product}
- Request: DELETE /v1/users/{user}/products/
- Operation: DeleteProduct
- Operation ID:
Product_Delete - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/clone
- Request: GET /v1/users/{user}/products/{product}/clone
- Operation: CloneProductConfig
- Operation ID:
Product_CloneConfig - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/clone' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
POST /v1/users/{user}/products/{product}/clone
- Request: POST /v1/users/{user}/products/{product}/clone
- Operation: CloneProduct
- Operation ID:
Product_Clone - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
enabled | boolean | no | ||
name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
product | string | yes | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
Example request: Copy with a new id
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/clone' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"product": "copy_of_product"
}'Example body: Copy with name and description
{
"description": "Same configuration as the original, for production line 2",
"name": "Line 2 copy",
"product": "line_2_product"
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/export
- Request: GET /v1/users/{user}/products/{product}/export
- Operation: ExportProduct
- Operation ID:
Product_Export - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/export' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/firmwares
- Request: GET /v1/users/{user}/products/{product}/firmwares
- Operation: ListProductFirmwares
- Operation ID:
Product_ListFirmwares - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
POST /v1/users/{user}/products/{product}/firmwares
- Request: POST /v1/users/{user}/products/{product}/firmwares
- Operation: CreateProductFirmware
- Operation ID:
Product_CreateFirmware - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
firmware | string | yes | Pattern: ^[a-zA-Z0-9_]{1,25}$ | |
name | string | no | Maximum length: 255 | |
version | string | yes | Pattern: (?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[\da-z-]+(?:\.[\da-z-]+)*)?(?:\+[\da-z-]+(?:\.[\da-z-]+)*)? |
Example request (skeleton generated from the schema: required fields only, neutral values)
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"firmware": "",
"version": ""
}'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}
- Request: GET /v1/users/{user}/products/{product}/firmwares/{firmware}/
- Operation: ReadProductFirmwareConfig
- Operation ID:
Product_ReadFirmwareConfig - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}
- Request: PUT /v1/users/{user}/products/{product}/firmwares/{firmware}/
- Operation: UpdateProductFirmware
- Operation ID:
Product_UpdateFirmware - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Request body (application/json, required)
A JSON object.
Example request (skeleton generated from the schema: required fields only, neutral values)
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{}'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
DELETE /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}
- Request: DELETE /v1/users/{user}/products/{product}/firmwares/{firmware}/
- Operation: DeleteProductFirmware
- Operation ID:
Product_DeleteFirmware - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Example request
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/flash
- Request: GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/flash
- Operation: FlashProductFirmware
- Operation ID:
Product_FlashFirmware - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION/flash' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/stream
- Request: GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/stream
- Operation: UpdateProductFirmware
- Operation ID:
Product_UpdateFirmwareStream - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION/stream' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/toolchain
- Request: GET /v1/users/{user}/products/{product}/firmwares/{firmware}/{firmware_version}/toolchain
- Operation: UpdateProductFirmware
- Operation ID:
Product_UpdateFirmwareToolchain - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
firmware | path | string | yes | |
firmware_version | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/firmwares/YOUR_FIRMWARE/YOUR_FIRMWARE_VERSION/toolchain' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/profile/code
- Request: GET /v1/users/{user}/products/{product}/profile/code
- Operation: ReadProductProfile
- Operation ID:
Product_ReadProfileCode - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/code' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/profile/code
- Request: PUT /v1/users/{user}/products/{product}/profile/code
- Operation: UpdateProductProfile
- Operation ID:
Product_UpdateProfileCode - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | object or null | no | JavaScript run by the server for this product: functions referenced by payload_function, device_id_resolver and function targets. Inline in code, or the files of a file storage in storage (takes precedence): its index.js, or <path>/index.js with path, so one storage can hold a whole application (dashboard, product code…). | |
(body).code | string or null | no | ||
(body).path | string or null | no | Folder of the storage with the code (its index.js and node_modules), relative to the storage root, e.g. "code/meter". Empty: the storage root. | |
(body).storage | string or null | no | File storage id with the product code. |
Example request: Code from a file storage
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/code' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"storage": "meter_product_code"
}'Example body: Code from a folder of an application storage
{
"path": "code/meter",
"storage": "fleet_app"
}Example body: Inline code
{
"code": "function resolveDevice(payload) {\n // device id from the serial sent by the caller\n return 'meter_' + payload.serial;\n}\n\nfunction toCelsius(payload) {\n return { temperature: (payload.temperature_f - 32) * 5 / 9 };\n}\n"
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/profile/console
- Request: GET /v1/users/{user}/products/{product}/profile/console
- Operation: ReadProductProfile
- Operation ID:
Product_ReadProfileConsole - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/console' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/profile/{category}
- Request: GET /v1/users/{user}/products/{product}/profile/
- Operation: ReadProductProfile
- Operation ID:
Product_ReadProfile - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
category | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/YOUR_CATEGORY' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/profile/{category}
- Request: PUT /v1/users/{user}/products/{product}/profile/
- Operation: UpdateProductProfile
- Operation ID:
Product_UpdateProfile - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Replace every entry of a profile category. Entries missing from the body are removed; to change one entry use PUT .../profile/{category}/{resource}.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
category | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | object or null | no | Every entry of a category, by id. Replaces the whole category: entries missing from the body are removed (for properties, also the default property on the devices). | |
(body).* | object or null | no | One entry of a product profile category; its id is the {resource} path parameter (or the key in a category body). Entries only run when enabled is true. Fields by category. properties: data fills the device property of the same id (optional), default.value (any value but null: {}, [], "", 0 and false count) / form / perm make it a property of the product, which every device of the product inherits (source: product) until it sets its own. buckets: data writes into the bucket with the entry id, created on the first write, outside any project (devices read it through GET /devices/{device}/buckets/{bucket}/data); an id containing {{device}} gives one bucket per device (such ids only fit the whole-category PUT, as the {resource} path parameter cannot hold braces), otherwise one shared bucket tagged with device (and group); tags, backend, retention. flows: data → sink, split_data sends each array element separately. api: resources added to every device of the product: request.data (target), response.data (response), device_id_resolver (function of the product code that returns the device id from the payload, needed to call the resource through POST /products/{product}/resources/{resource}), handle_connectivity (validate / auto-provision the device on calls; default true for resource_stream targets). autoprovisions: config. endpoints: deprecated, use flows with an endpoint_call sink. | |
(body).*.backend | any | no | buckets: storage backend of the bucket when it is created (mongodb, influxdb, dynamodb; default the server's). | |
(body).*.config | object or null | no | autoprovisions: when a device that does not exist authenticates or calls a resource and its id matches pattern, it is created in this product (HTTP, or Subdevice for MQTT), with asset type / group and project if given. | |
(body).*.config.group | string or null | no | Asset group for the new devices. | |
(body).*.config.mode | string or null | no | pattern | |
(body).*.config.pattern | string or null | no | Regular expression on the device id, e.g. ^meter_[0-9]{6}$. | |
(body).*.config.project | string or null | no | Project for the new devices. | |
(body).*.config.type | string or null | no | Asset type for the new devices. | |
(body).*.data | object or null or array of object or null or null or null | no | Data source, or an array of sources. | |
(body).*.data | object or null | no | Variant 1: Where a properties / buckets / flows entry gets its data. source selects the fields used: topic → topic (MQTT topic, + and # wildcards; {{name}} placeholders match one level, and in buckets each one becomes a tag of the record, with {{field}} naming the record field so several topics merge into one record); resource → resource, update (interval | events) with interval + magnitude; resource_stream → resource_stream (the device pushes it); product_stream → product_stream; event → event with optional filter. Only devices of this product are listened to. The received data can then be transformed with payload_type / payload and payload_function. | |
(body).*.data.event | string or null | no | Variant 1: source event: server event name, e.g. device_state_change, device_property_update, bucket_write. | |
(body).*.data.filter | object or null | no | Variant 1: source event: extra filters (event field: value or regex). The product filter is always added. | |
(body).*.data.interval | number or string or null | no | Variant 1: source resource with update interval: number of magnitude units between reads, e.g. 60. | |
(body).*.data.magnitude | string or null | no | Variant 1: second (default) | minute | hour | day | week | month | year | |
(body).*.data.patch | boolean or null | no | Variant 1: properties only: merge the value into the device property instead of replacing it. | |
(body).*.data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).*.data.payload_function | string or null | no | Variant 1: Name of a function of the product code that receives the payload and returns the value to use. | |
(body).*.data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).*.data.product_stream | string or null | no | Variant 1: source product_stream: stream published by an API resource or flow of this product (target product_stream). | |
(body).*.data.resource | string or null | no | Variant 1: source resource: device resource read by the server. | |
(body).*.data.resource_stream | string or null | no | Variant 1: source resource_stream: device resource the device streams on its own. | |
(body).*.data.source | string or null | no | Variant 1: topic | resource | resource_stream | product_stream | event | |
(body).*.data.topic | string or null | no | Variant 1: source topic: MQTT topic of the device messages, e.g. devices/{{device}}/telemetry. | |
(body).*.data.update | string or null | no | Variant 1: source resource: interval (default, read every interval magnitude) | events (the device streams it when it changes). | |
(body).*.data | array of object or null or null | no | Variant 2: | |
(body).*.data[].event | string or null | no | Variant 2: source event: server event name, e.g. device_state_change, device_property_update, bucket_write. | |
(body).*.data[].filter | object or null | no | Variant 2: source event: extra filters (event field: value or regex). The product filter is always added. | |
(body).*.data[].interval | number or string or null | no | Variant 2: source resource with update interval: number of magnitude units between reads, e.g. 60. | |
(body).*.data[].magnitude | string or null | no | Variant 2: second (default) | minute | hour | day | week | month | year | |
(body).*.data[].patch | boolean or null | no | Variant 2: properties only: merge the value into the device property instead of replacing it. | |
(body).*.data[].payload | any | no | Variant 2: Template string (payload_type template_payload) or JSON value. | |
(body).*.data[].payload_function | string or null | no | Variant 2: Name of a function of the product code that receives the payload and returns the value to use. | |
(body).*.data[].payload_type | string or null or null | no | Variant 2: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).*.data[].product_stream | string or null | no | Variant 2: source product_stream: stream published by an API resource or flow of this product (target product_stream). | |
(body).*.data[].resource | string or null | no | Variant 2: source resource: device resource read by the server. | |
(body).*.data[].resource_stream | string or null | no | Variant 2: source resource_stream: device resource the device streams on its own. | |
(body).*.data[].source | string or null | no | Variant 2: topic | resource | resource_stream | product_stream | event | |
(body).*.data[].topic | string or null | no | Variant 2: source topic: MQTT topic of the device messages, e.g. devices/{{device}}/telemetry. | |
(body).*.data[].update | string or null | no | Variant 2: source resource: interval (default, read every interval magnitude) | events (the device streams it when it changes). | |
(body).*.data | null | no | Variant 3: | |
(body).*.default | object or null | no | properties: value of the product property that the devices inherit until they set their own, in value. Any value but null counts, {} and [] included. | |
(body).*.default.value | any | no | ||
(body).*.description | string or null | no | ||
(body).*.device_id_resolver | string or null | no | ||
(body).*.enabled | boolean or null | no | ||
(body).*.form | object or null | no | properties: form used by the console to edit the value (fields). | |
(body).*.handle_connectivity | boolean or null | no | ||
(body).*.name | string or null | no | ||
(body).*.perm | object or null | no | properties: console permissions, as the roles that do not see the property (hidden) or cannot edit it (readOnly); as in device properties. | |
(body).*.perm.hidden | array of string or null | no | Unique items | |
(body).*.perm.readOnly | array of string or null | no | Unique items | |
(body).*.request | object or null | no | ||
(body).*.request.data | object or null or null | no | ||
(body).*.request.data | object or null | no | Variant 1: What an API resource request (request.data) or a flow (sink) does. target selects the fields used: topic → topic (+ retain): publish to the device over MQTT; resource → resource: call a device resource (IOTMP devices); resource_stream → resource_stream; property → property: set a device property; function → function: run a function of the product code; endpoint_call → endpoint: call an endpoint; plugin_endpoint → plugin + path; product_stream → product_stream (and optional product): publish to a product stream; none. The body sent is built from payload / payload_type / payload_function. A target needs a device: the one in the URL, the source device, or the one returned by the entry's device_id_resolver. | |
(body).*.request.data.endpoint | string or null | no | Variant 1: target endpoint_call: endpoint id (may use placeholders). | |
(body).*.request.data.function | string or null | no | Variant 1: | |
(body).*.request.data.path | string or null | no | Variant 1: target plugin_endpoint: path inside the plugin, e.g. /api/process. | |
(body).*.request.data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).*.request.data.payload_function | string or null | no | Variant 1: | |
(body).*.request.data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).*.request.data.plugin | string or null | no | Variant 1: | |
(body).*.request.data.product | string or null | no | Variant 1: | |
(body).*.request.data.product_stream | string or null | no | Variant 1: | |
(body).*.request.data.property | string or null | no | Variant 1: | |
(body).*.request.data.resource | string or null | no | Variant 1: | |
(body).*.request.data.resource_stream | string or null | no | Variant 1: | |
(body).*.request.data.retain | boolean or null | no | Variant 1: target topic: publish as a retained MQTT message. | |
(body).*.request.data.target | string or null | no | Variant 1: topic | resource | resource_stream | property | function | endpoint_call | plugin_endpoint | product_stream | none | |
(body).*.request.data.topic | string or null | no | Variant 1: | |
(body).*.request.data | null | no | Variant 2: | |
(body).*.response | object or null | no | ||
(body).*.response.data | object or null or null | no | ||
(body).*.response.data | object or null | no | Variant 1: What an API resource answers (response.data). source selects it: request_response: what the request target returned; topic → topic: wait for a message on that MQTT topic (from the same device, or any with publish_source: any); property → property; resource → resource; function → function; endpoint_call → endpoint; none. The answer can be shaped with payload / payload_type / payload_function. | |
(body).*.response.data.endpoint | string or null | no | Variant 1: | |
(body).*.response.data.function | string or null | no | Variant 1: | |
(body).*.response.data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).*.response.data.payload_function | string or null | no | Variant 1: | |
(body).*.response.data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).*.response.data.property | string or null | no | Variant 1: | |
(body).*.response.data.publish_source | string or null | no | Variant 1: source topic: empty (only the same device) or any. | |
(body).*.response.data.resource | string or null | no | Variant 1: | |
(body).*.response.data.source | string or null | no | Variant 1: request_response | topic | property | resource | function | endpoint_call | none | |
(body).*.response.data.topic | string or null | no | Variant 1: | |
(body).*.response.data | null | no | Variant 2: | |
(body).*.retention | object or null | no | buckets: retention of the bucket when it is created. | |
(body).*.retention.period | integer or string or null | no | 0 = unlimited. | |
(body).*.retention.unit | string or null | no | hours | days | weeks | months | years | |
(body).*.sink | object or null or null | no | ||
(body).*.sink | object or null | no | Variant 1: What an API resource request (request.data) or a flow (sink) does. target selects the fields used: topic → topic (+ retain): publish to the device over MQTT; resource → resource: call a device resource (IOTMP devices); resource_stream → resource_stream; property → property: set a device property; function → function: run a function of the product code; endpoint_call → endpoint: call an endpoint; plugin_endpoint → plugin + path; product_stream → product_stream (and optional product): publish to a product stream; none. The body sent is built from payload / payload_type / payload_function. A target needs a device: the one in the URL, the source device, or the one returned by the entry's device_id_resolver. | |
(body).*.sink.endpoint | string or null | no | Variant 1: target endpoint_call: endpoint id (may use placeholders). | |
(body).*.sink.function | string or null | no | Variant 1: | |
(body).*.sink.path | string or null | no | Variant 1: target plugin_endpoint: path inside the plugin, e.g. /api/process. | |
(body).*.sink.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).*.sink.payload_function | string or null | no | Variant 1: | |
(body).*.sink.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).*.sink.plugin | string or null | no | Variant 1: | |
(body).*.sink.product | string or null | no | Variant 1: | |
(body).*.sink.product_stream | string or null | no | Variant 1: | |
(body).*.sink.property | string or null | no | Variant 1: | |
(body).*.sink.resource | string or null | no | Variant 1: | |
(body).*.sink.resource_stream | string or null | no | Variant 1: | |
(body).*.sink.retain | boolean or null | no | Variant 1: target topic: publish as a retained MQTT message. | |
(body).*.sink.target | string or null | no | Variant 1: topic | resource | resource_stream | property | function | endpoint_call | plugin_endpoint | product_stream | none | |
(body).*.sink.topic | string or null | no | Variant 1: | |
(body).*.sink | null | no | Variant 2: | |
(body).*.split_data | boolean or null | no | ||
(body).*.tags | array or null | no | buckets: record fields stored as tags (filterable), e.g. ["line"]. | |
(body).*.type | string or null | no | properties: "" or configuration. |
Example request: All buckets of the product, one of them per device (PUT …/profile/buckets)
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/YOUR_CATEGORY' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"telemetry": {
"data": {
"interval": 60,
"magnitude": "second",
"payload_type": "source_payload",
"resource": "telemetry",
"source": "resource",
"update": "interval"
},
"description": "One shared bucket, tagged with each device",
"enabled": true,
"name": "Telemetry",
"retention": {
"period": 6,
"unit": "months"
}
},
"{{device}}_readings": {
"data": {
"payload_type": "source_payload",
"source": "topic",
"topic": "plant/{{line}}/{{device}}/{{field}}"
},
"enabled": true,
"name": "Readings",
"tags": [
"line"
]
}
}'Example body: Remove every flow (PUT …/profile/flows)
{}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/profile/{category}/{resource}
- Request: GET /v1/users/{user}/products/{product}/profile/{category}/
- Operation: ReadProductProfile
- Operation ID:
Product_ReadProductProfileResource - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
category | path | string | yes | |
resource | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/YOUR_CATEGORY/YOUR_RESOURCE' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/profile/{category}/{resource}
- Request: PUT /v1/users/{user}/products/{product}/profile/{category}/
- Operation: UpdateProductProfile
- Operation ID:
Product_UpdateProductProfileResource - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Create or replace one entry of a profile category (properties, buckets, flows, api, autoprovisions; endpoints is deprecated). The product is reinitialized, so the change applies at once to its devices.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
category | path | string | yes | |
resource | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | object or null | no | One entry of a product profile category; its id is the {resource} path parameter (or the key in a category body). Entries only run when enabled is true. Fields by category. properties: data fills the device property of the same id (optional), default.value (any value but null: {}, [], "", 0 and false count) / form / perm make it a property of the product, which every device of the product inherits (source: product) until it sets its own. buckets: data writes into the bucket with the entry id, created on the first write, outside any project (devices read it through GET /devices/{device}/buckets/{bucket}/data); an id containing {{device}} gives one bucket per device (such ids only fit the whole-category PUT, as the {resource} path parameter cannot hold braces), otherwise one shared bucket tagged with device (and group); tags, backend, retention. flows: data → sink, split_data sends each array element separately. api: resources added to every device of the product: request.data (target), response.data (response), device_id_resolver (function of the product code that returns the device id from the payload, needed to call the resource through POST /products/{product}/resources/{resource}), handle_connectivity (validate / auto-provision the device on calls; default true for resource_stream targets). autoprovisions: config. endpoints: deprecated, use flows with an endpoint_call sink. | |
(body).backend | any | no | buckets: storage backend of the bucket when it is created (mongodb, influxdb, dynamodb; default the server's). | |
(body).config | object or null | no | autoprovisions: when a device that does not exist authenticates or calls a resource and its id matches pattern, it is created in this product (HTTP, or Subdevice for MQTT), with asset type / group and project if given. | |
(body).config.group | string or null | no | Asset group for the new devices. | |
(body).config.mode | string or null | no | pattern | |
(body).config.pattern | string or null | no | Regular expression on the device id, e.g. ^meter_[0-9]{6}$. | |
(body).config.project | string or null | no | Project for the new devices. | |
(body).config.type | string or null | no | Asset type for the new devices. | |
(body).data | object or null or array of object or null or null or null | no | Data source, or an array of sources. | |
(body).data | object or null | no | Variant 1: Where a properties / buckets / flows entry gets its data. source selects the fields used: topic → topic (MQTT topic, + and # wildcards; {{name}} placeholders match one level, and in buckets each one becomes a tag of the record, with {{field}} naming the record field so several topics merge into one record); resource → resource, update (interval | events) with interval + magnitude; resource_stream → resource_stream (the device pushes it); product_stream → product_stream; event → event with optional filter. Only devices of this product are listened to. The received data can then be transformed with payload_type / payload and payload_function. | |
(body).data.event | string or null | no | Variant 1: source event: server event name, e.g. device_state_change, device_property_update, bucket_write. | |
(body).data.filter | object or null | no | Variant 1: source event: extra filters (event field: value or regex). The product filter is always added. | |
(body).data.interval | number or string or null | no | Variant 1: source resource with update interval: number of magnitude units between reads, e.g. 60. | |
(body).data.magnitude | string or null | no | Variant 1: second (default) | minute | hour | day | week | month | year | |
(body).data.patch | boolean or null | no | Variant 1: properties only: merge the value into the device property instead of replacing it. | |
(body).data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).data.payload_function | string or null | no | Variant 1: Name of a function of the product code that receives the payload and returns the value to use. | |
(body).data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).data.product_stream | string or null | no | Variant 1: source product_stream: stream published by an API resource or flow of this product (target product_stream). | |
(body).data.resource | string or null | no | Variant 1: source resource: device resource read by the server. | |
(body).data.resource_stream | string or null | no | Variant 1: source resource_stream: device resource the device streams on its own. | |
(body).data.source | string or null | no | Variant 1: topic | resource | resource_stream | product_stream | event | |
(body).data.topic | string or null | no | Variant 1: source topic: MQTT topic of the device messages, e.g. devices/{{device}}/telemetry. | |
(body).data.update | string or null | no | Variant 1: source resource: interval (default, read every interval magnitude) | events (the device streams it when it changes). | |
(body).data | array of object or null or null | no | Variant 2: | |
(body).data[].event | string or null | no | Variant 2: source event: server event name, e.g. device_state_change, device_property_update, bucket_write. | |
(body).data[].filter | object or null | no | Variant 2: source event: extra filters (event field: value or regex). The product filter is always added. | |
(body).data[].interval | number or string or null | no | Variant 2: source resource with update interval: number of magnitude units between reads, e.g. 60. | |
(body).data[].magnitude | string or null | no | Variant 2: second (default) | minute | hour | day | week | month | year | |
(body).data[].patch | boolean or null | no | Variant 2: properties only: merge the value into the device property instead of replacing it. | |
(body).data[].payload | any | no | Variant 2: Template string (payload_type template_payload) or JSON value. | |
(body).data[].payload_function | string or null | no | Variant 2: Name of a function of the product code that receives the payload and returns the value to use. | |
(body).data[].payload_type | string or null or null | no | Variant 2: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).data[].product_stream | string or null | no | Variant 2: source product_stream: stream published by an API resource or flow of this product (target product_stream). | |
(body).data[].resource | string or null | no | Variant 2: source resource: device resource read by the server. | |
(body).data[].resource_stream | string or null | no | Variant 2: source resource_stream: device resource the device streams on its own. | |
(body).data[].source | string or null | no | Variant 2: topic | resource | resource_stream | product_stream | event | |
(body).data[].topic | string or null | no | Variant 2: source topic: MQTT topic of the device messages, e.g. devices/{{device}}/telemetry. | |
(body).data[].update | string or null | no | Variant 2: source resource: interval (default, read every interval magnitude) | events (the device streams it when it changes). | |
(body).data | null | no | Variant 3: | |
(body).default | object or null | no | properties: value of the product property that the devices inherit until they set their own, in value. Any value but null counts, {} and [] included. | |
(body).default.value | any | no | ||
(body).description | string or null | no | ||
(body).device_id_resolver | string or null | no | ||
(body).enabled | boolean or null | no | ||
(body).form | object or null | no | properties: form used by the console to edit the value (fields). | |
(body).handle_connectivity | boolean or null | no | ||
(body).name | string or null | no | ||
(body).perm | object or null | no | properties: console permissions, as the roles that do not see the property (hidden) or cannot edit it (readOnly); as in device properties. | |
(body).perm.hidden | array of string or null | no | Unique items | |
(body).perm.readOnly | array of string or null | no | Unique items | |
(body).request | object or null | no | ||
(body).request.data | object or null or null | no | ||
(body).request.data | object or null | no | Variant 1: What an API resource request (request.data) or a flow (sink) does. target selects the fields used: topic → topic (+ retain): publish to the device over MQTT; resource → resource: call a device resource (IOTMP devices); resource_stream → resource_stream; property → property: set a device property; function → function: run a function of the product code; endpoint_call → endpoint: call an endpoint; plugin_endpoint → plugin + path; product_stream → product_stream (and optional product): publish to a product stream; none. The body sent is built from payload / payload_type / payload_function. A target needs a device: the one in the URL, the source device, or the one returned by the entry's device_id_resolver. | |
(body).request.data.endpoint | string or null | no | Variant 1: target endpoint_call: endpoint id (may use placeholders). | |
(body).request.data.function | string or null | no | Variant 1: | |
(body).request.data.path | string or null | no | Variant 1: target plugin_endpoint: path inside the plugin, e.g. /api/process. | |
(body).request.data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).request.data.payload_function | string or null | no | Variant 1: | |
(body).request.data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).request.data.plugin | string or null | no | Variant 1: | |
(body).request.data.product | string or null | no | Variant 1: | |
(body).request.data.product_stream | string or null | no | Variant 1: | |
(body).request.data.property | string or null | no | Variant 1: | |
(body).request.data.resource | string or null | no | Variant 1: | |
(body).request.data.resource_stream | string or null | no | Variant 1: | |
(body).request.data.retain | boolean or null | no | Variant 1: target topic: publish as a retained MQTT message. | |
(body).request.data.target | string or null | no | Variant 1: topic | resource | resource_stream | property | function | endpoint_call | plugin_endpoint | product_stream | none | |
(body).request.data.topic | string or null | no | Variant 1: | |
(body).request.data | null | no | Variant 2: | |
(body).response | object or null | no | ||
(body).response.data | object or null or null | no | ||
(body).response.data | object or null | no | Variant 1: What an API resource answers (response.data). source selects it: request_response: what the request target returned; topic → topic: wait for a message on that MQTT topic (from the same device, or any with publish_source: any); property → property; resource → resource; function → function; endpoint_call → endpoint; none. The answer can be shaped with payload / payload_type / payload_function. | |
(body).response.data.endpoint | string or null | no | Variant 1: | |
(body).response.data.function | string or null | no | Variant 1: | |
(body).response.data.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).response.data.payload_function | string or null | no | Variant 1: | |
(body).response.data.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).response.data.property | string or null | no | Variant 1: | |
(body).response.data.publish_source | string or null | no | Variant 1: source topic: empty (only the same device) or any. | |
(body).response.data.resource | string or null | no | Variant 1: | |
(body).response.data.source | string or null | no | Variant 1: request_response | topic | property | resource | function | endpoint_call | none | |
(body).response.data.topic | string or null | no | Variant 1: | |
(body).response.data | null | no | Variant 2: | |
(body).retention | object or null | no | buckets: retention of the bucket when it is created. | |
(body).retention.period | integer or string or null | no | 0 = unlimited. | |
(body).retention.unit | string or null | no | hours | days | weeks | months | years | |
(body).sink | object or null or null | no | ||
(body).sink | object or null | no | Variant 1: What an API resource request (request.data) or a flow (sink) does. target selects the fields used: topic → topic (+ retain): publish to the device over MQTT; resource → resource: call a device resource (IOTMP devices); resource_stream → resource_stream; property → property: set a device property; function → function: run a function of the product code; endpoint_call → endpoint: call an endpoint; plugin_endpoint → plugin + path; product_stream → product_stream (and optional product): publish to a product stream; none. The body sent is built from payload / payload_type / payload_function. A target needs a device: the one in the URL, the source device, or the one returned by the entry's device_id_resolver. | |
(body).sink.endpoint | string or null | no | Variant 1: target endpoint_call: endpoint id (may use placeholders). | |
(body).sink.function | string or null | no | Variant 1: | |
(body).sink.path | string or null | no | Variant 1: target plugin_endpoint: path inside the plugin, e.g. /api/process. | |
(body).sink.payload | any | no | Variant 1: Template string (payload_type template_payload) or JSON value. | |
(body).sink.payload_function | string or null | no | Variant 1: | |
(body).sink.payload_type | string or null or null | no | Variant 1: How the payload is built. template_payload (default): payload is a template that may use {{payload}}, {{payload.field}}, {{device}}, {{property.<name>}}, {{api.<resource>}} or {{meta.<device field>}}; without payload it yields nothing, so a properties or buckets entry writes nothing. source_payload: the data as received (the same as payload "{{payload}}"). source_event: the whole event (device, product, timestamps, payload…). none: no payload. | |
(body).sink.plugin | string or null | no | Variant 1: | |
(body).sink.product | string or null | no | Variant 1: | |
(body).sink.product_stream | string or null | no | Variant 1: | |
(body).sink.property | string or null | no | Variant 1: | |
(body).sink.resource | string or null | no | Variant 1: | |
(body).sink.resource_stream | string or null | no | Variant 1: | |
(body).sink.retain | boolean or null | no | Variant 1: target topic: publish as a retained MQTT message. | |
(body).sink.target | string or null | no | Variant 1: topic | resource | resource_stream | property | function | endpoint_call | plugin_endpoint | product_stream | none | |
(body).sink.topic | string or null | no | Variant 1: | |
(body).sink | null | no | Variant 2: | |
(body).split_data | boolean or null | no | ||
(body).tags | array or null | no | buckets: record fields stored as tags (filterable), e.g. ["line"]. | |
(body).type | string or null | no | properties: "" or configuration. |
Example request: API resource that calls an endpoint (PUT …/profile/api/notify)
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/YOUR_CATEGORY/YOUR_RESOURCE' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"description": "Sends a notification from the device",
"enabled": true,
"name": "Notify",
"request": {
"data": {
"endpoint": "notify_email",
"payload": "{\"device\": \"{{device}}\", \"message\": \"{{payload.message}}\"}",
"payload_type": "template_payload",
"target": "endpoint_call"
}
},
"response": {
"data": {
"source": "request_response"
}
}
}'Example body: API resource to configure a device by serial, with device_id_resolver (PUT …/profile/api/configure)
{
"device_id_resolver": "resolveDevice",
"enabled": true,
"name": "Configure",
"request": {
"data": {
"payload": "{{payload.settings}}",
"property": "settings",
"target": "property"
}
},
"response": {
"data": {
"source": "request_response"
}
}
}Example body: Autoprovision devices by id pattern (PUT …/profile/autoprovisions/meters)
{
"config": {
"group": "plant_a",
"mode": "pattern",
"pattern": "^meter_[0-9]{6}$",
"type": "meter"
},
"description": "Creates meter_XXXXXX devices on their first connection",
"enabled": true,
"name": "Meters"
}Example body: Bucket fed from a device resource every 60 s (PUT …/profile/buckets/telemetry)
{
"data": {
"interval": 60,
"magnitude": "second",
"payload_type": "source_payload",
"resource": "telemetry",
"source": "resource",
"update": "interval"
},
"description": "One shared bucket, tagged with each device",
"enabled": true,
"name": "Telemetry",
"retention": {
"period": 6,
"unit": "months"
}
}Example body: Bucket from MQTT topics with tags (PUT …/profile/buckets/readings)
{
"data": {
"payload_type": "source_payload",
"source": "topic",
"topic": "plant/{{line}}/{{device}}/{{field}}"
},
"enabled": true,
"name": "Readings",
"tags": [
"line"
]
}Example body: Configuration property with a default (PUT …/profile/properties/settings)
{
"default": {
"value": {
"report_interval": 60,
"threshold": 25.5
}
},
"enabled": true,
"name": "Settings",
"perm": {
"hidden": [],
"readOnly": [
"member"
]
},
"type": "configuration"
}Example body: Flow: email when a device disconnects (PUT …/profile/flows/offline_alert)
{
"data": {
"event": "device_state_change",
"filter": {
"state": "disconnected"
},
"payload_type": "source_event",
"source": "event"
},
"enabled": true,
"name": "Offline alert",
"sink": {
"endpoint": "notify_email",
"payload": "{\"text\": \"{{device}} is offline\"}",
"target": "endpoint_call"
}
}Example body: Property set from an MQTT topic (PUT …/profile/properties/status)
{
"data": {
"payload_type": "source_payload",
"source": "topic",
"topic": "devices/{{device}}/status"
},
"default": {
"value": {
"state": "unknown"
}
},
"description": "Last status message",
"enabled": true,
"name": "Status"
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
DELETE /v1/users/{user}/products/{product}/profile/{category}/{resource}
- Request: DELETE /v1/users/{user}/products/{product}/profile/{category}/
- Operation: UpdateProductProfile
- Operation ID:
Product_DeleteProductProfileResource - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
category | path | string | yes | |
resource | path | string | yes |
Example request
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/profile/YOUR_CATEGORY/YOUR_RESOURCE' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/projects
- Request: PUT /v1/users/{user}/products/{product}/projects
- Operation: UpdateProductProjects
- Operation ID:
Product_UpdateProjects - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | array of string | no | Projects the resource belongs to, as <owner>@<project> ids. Replaces the whole list: read the current one first to add or remove a single project; [] removes it from every project. |
Example request: No projects
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/projects' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '[]'Example body: One project
[
"YOUR_USER@greenhouse"
]Example body: Two projects
[
"YOUR_USER@greenhouse",
"YOUR_USER@maintenance"
]Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/properties
- Request: GET /v1/users/{user}/products/{product}/properties
- Operation: ListProductProperties
- Operation ID:
Product_ListProperties - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
Response example (200)
[
{
"created": 1792263090737,
"description": "Sampling and alert thresholds",
"modified": 1792263090737,
"name": "Settings",
"property": "settings",
"type": "configuration",
"value": {
"alerts": true,
"interval": 60,
"max_temperature": 28.5
}
},
{
"created": 1792263090737,
"modified": 1792263090737,
"name": "Location",
"property": "location",
"value": {
"lat": 40.4168,
"lon": -3.7038
}
},
{
"created": 1792263090737,
"modified": 1792263090737,
"name": "Calibration",
"perm": {
"readOnly": [
"member"
]
},
"property": "calibration",
"value": {
"gain": 1.02,
"offset": -0.4
}
},
{
"created": 1792263090737,
"modified": 1792263090737,
"name": "Dashboard",
"property": "dashboard",
"value": {
"source": "url",
"url": "/v1/users/YOUR_USER/storages/fleet_app/files/"
}
}
]POST /v1/users/{user}/products/{product}/properties
- Request: POST /v1/users/{user}/products/{product}/properties
- Operation: CreateProductProperty
- Operation ID:
Product_CreateProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Request body (application/json, required)
The body matches one of these 2 variants.
Variant 1
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | array of object | no | ||
(body)[].description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
(body)[].form | object | no | ||
(body)[].form.fields | any | yes | ||
(body)[].name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
(body)[].perm | object | no | ||
(body)[].perm.hidden | array of string | no | Unique items | |
(body)[].perm.readOnly | array of string | no | Unique items | |
(body)[].property | string | yes | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
(body)[].type | string | no | One of: ``, configuration | |
(body)[].value | any | yes |
Variant 2: Property Create. Schema for creating a property
Schema for creating a property
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
form | object | no | ||
form.fields | any | yes | ||
name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
perm | object | no | ||
perm.hidden | array of string | no | Unique items | |
perm.readOnly | array of string | no | Unique items | |
property | string | yes | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
type | string | no | One of: ``, configuration | |
value | any | yes |
Example request: Configuration value
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"description": "Sampling and alert thresholds",
"name": "Settings",
"property": "settings",
"type": "configuration",
"value": {
"alerts": true,
"interval": 60,
"max_temperature": 28.5
}
}'Example body: Location
{
"name": "Location",
"property": "location",
"value": {
"lat": 40.4168,
"lon": -3.7038
}
}Example body: Read-only for project members
{
"name": "Calibration",
"perm": {
"readOnly": [
"member"
]
},
"property": "calibration",
"value": {
"gain": 1.02,
"offset": -0.4
}
}Example body: Url dashboard of the resource
{
"name": "Dashboard",
"property": "dashboard",
"value": {
"source": "url",
"url": "/v1/users/YOUR_USER/storages/fleet_app/files/"
}
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/properties/{property}
- Request: GET /v1/users/{user}/products/{product}/properties/
- Operation: ReadProductProperty
- Operation ID:
Product_ReadProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/properties/{property}
- Request: PUT /v1/users/{user}/products/{product}/properties/
- Operation: UpdateProductProperty
- Operation ID:
Product_UpdateProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Request body (application/json, required)
Schema for updating a property
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
form | object | no | ||
form.fields | any | yes | ||
name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
perm | object | no | ||
perm.hidden | array of string | no | Unique items | |
perm.readOnly | array of string | no | Unique items | |
property | string | no | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
type | string | no | One of: ``, configuration | |
value | any | yes |
Example request: Hide from project members
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"perm": {
"hidden": [
"member"
]
},
"value": "internal note"
}'Example body: Replace the value
{
"value": {
"alerts": true,
"interval": 30,
"max_temperature": 27
}
}Example body: Value, name and description
{
"description": "Faster sampling during commissioning",
"name": "Settings",
"value": {
"alerts": false,
"interval": 10,
"max_temperature": 28.5
}
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PATCH /v1/users/{user}/products/{product}/properties/{property}
- Request: PATCH /v1/users/{user}/products/{product}/properties/
- Operation: UpdateProductProperty
- Operation ID:
Product_PatchProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Request body (application/json, required)
The body matches one of these 2 variants.
Variant 1
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
value | any | yes |
Variant 2
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
* | any | no |
Example request: Change some fields of the value
curl -X PATCH 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"value": {
"interval": 30
}
}'Example body: Flattened fields
{
"value.alerts": false,
"value.max_temperature": 27
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
DELETE /v1/users/{user}/products/{product}/properties/{property}
- Request: DELETE /v1/users/{user}/products/{product}/properties/
- Operation: DeleteProductProperty
- Operation ID:
Product_DeleteProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Example request
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/properties/{property}/clone
- Request: GET /v1/users/{user}/products/{product}/properties/{property}/clone
- Operation: CloneProductPropertyConfig
- Operation ID:
Product_ClonePropertyConfig - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY/clone' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
POST /v1/users/{user}/products/{product}/properties/{property}/clone
- Request: POST /v1/users/{user}/products/{product}/properties/{property}/clone
- Operation: CloneProductProperty
- Operation ID:
Product_CloneProperty - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
property | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
description | string | no | Maximum length: 255 | A brief description of the resource, providing context or additional information, limited to 255 characters. |
enabled | boolean | no | ||
name | string | no | Maximum length: 255 | The name of the resource, limited to 255 characters. It can include any character. |
property | string | yes | Pattern: ^[a-zA-Z0-9_-]{1,32}$ | A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters. |
Example request: Copy with a new id
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/properties/YOUR_PROPERTY/clone' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"property": "copy_of_property"
}'Example body: Copy with name and description
{
"description": "Same configuration as the original, for production line 2",
"name": "Line 2 copy",
"property": "line_2_property"
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
POST /v1/users/{user}/products/{product}/resources/{resource}
- Request: POST /v1/users/{user}/products/{product}/resources/
- Operation: AccessProductResources
- Operation ID:
Product_AccessResources - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Call an API resource of the product (profile api) without naming a device. The body is free (any JSON, or an array to call it once per element) and is the {{payload}} of the resource. A device is only reached when the resource defines device_id_resolver, a product code function that returns the device id from the payload.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
resource | path | string | yes |
Request body (application/json, required)
A JSON object.
Example request (skeleton generated from the schema: required fields only, neutral values)
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/resources/YOUR_RESOURCE' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{}'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/services
- Request: GET /v1/users/{user}/products/{product}/services
- Operation: ReadProductServices
- Operation ID:
Product_ReadServices - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/services' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
GET /v1/users/{user}/products/{product}/services/{service}
- Request: GET /v1/users/{user}/products/{product}/services/
- Operation: ReadProductServices
- Operation ID:
Product_ReadServices - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
service | path | string | yes |
Example request
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/services/YOUR_SERVICE' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
PUT /v1/users/{user}/products/{product}/services/{service}
- Request: PUT /v1/users/{user}/products/{product}/services/
- Operation: UpdateProductServices
- Operation ID:
Product_UpdateServices - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
service | path | string | yes |
Request body (application/json, required)
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
(body) | object or null | no | A service the devices of the product expose, reached through the server: web (HTTP proxy) or vnc (remote desktop). The target is the address and port as seen from the device. | |
(body).description | string or null | no | ||
(body).enabled | boolean or null | no | ||
(body).name | string or null | no | ||
(body).security | object or null | no | ||
(body).security.ip_filtering | boolean or null | no | ||
(body).security.timeout_minutes | number or null | no | ||
(body).target | object or null | no | ||
(body).target.address | string or null | no | e.g. 127.0.0.1 | |
(body).target.port | integer or string or null | no | e.g. 8080 | |
(body).target.secure | boolean or null | no | The target uses TLS. | |
(body).type | string or null | no | web (default) | vnc | |
(body).vnc | object or null | no | ||
(body).vnc.compression | number or null | no | ||
(body).vnc.quality | number or null | no | ||
(body).vnc.scale | boolean or null | no | ||
(body).vnc.shared | boolean or null | no | ||
(body).vnc.viewonly | boolean or null | no |
Example request: Remote desktop (PUT …/services/desktop)
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/services/YOUR_SERVICE' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"enabled": true,
"name": "Desktop",
"target": {
"address": "127.0.0.1",
"port": 5900
},
"type": "vnc",
"vnc": {
"compression": 2,
"quality": 6,
"scale": true,
"shared": true,
"viewonly": false
}
}'Example body: Web interface of the device (PUT …/services/web_ui)
{
"description": "Device configuration page",
"enabled": true,
"name": "Web UI",
"security": {
"ip_filtering": false,
"timeout_minutes": 60
},
"target": {
"address": "127.0.0.1",
"port": 8080,
"secure": false
},
"type": "web"
}Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |
DELETE /v1/users/{user}/products/{product}/services/{service}
- Request: DELETE /v1/users/{user}/products/{product}/services/
- Operation: DeleteProductServices
- Operation ID:
Product_DeleteServices - Authentication: access token,
Authorization: Bearer YOUR_TOKEN
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
user | path | string | yes | |
product | path | string | yes | |
service | path | string | yes |
Example request
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/products/YOUR_PRODUCT/services/YOUR_SERVICE' \
-H 'Authorization: Bearer YOUR_TOKEN'Responses
| Status | Description |
|---|---|
| 200 | ok |
| 401 | unauthorized |
| 403 | forbidden |