Skip to content

Reference

Dashboards

REST API reference for Dashboards: create, read, update, clone and delete dashboards. 8 operations.

Reference4 min read

For the base URL, authentication and errors, see the REST API overview.

GET /v1/users/{user}/dashboards ​

  • Request: GET /v1/users/{user}/dashboards
  • Operation: ListDashboards
  • Operation ID: Dashboard_List
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes

Example request

bash
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Responses

StatusDescription
200ok
401unauthorized
403forbidden

Response example (200)

json
[
  {
    "created": 1792263090743,
    "dashboard": "plant_overview",
    "description": "Production KPIs",
    "modified": 1792263090743,
    "name": "Plant overview"
  },
  {
    "created": 1792263090743,
    "dashboard": "fleet",
    "description": "Device list and detail app",
    "modified": 1792263090743,
    "name": "Fleet",
    "source": "url"
  }
]

POST /v1/users/{user}/dashboards ​

  • Request: POST /v1/users/{user}/dashboards
  • Operation: CreateDashboard
  • Operation ID: Dashboard_Create
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes

Request body (application/json, required)

Widget dashboards are designed in the console editor (tabs with widgets). Url dashboards (source: url) render a web page, usually an app in a public file storage that is built with the dashboard SDK (npm package @thinger-io/dashboard-sdk). To show a dashboard on a device, product, asset type, group or project page, store the same object as its 'dashboard' property instead.

FieldTypeRequiredConstraintsDescription
controlsanyno
dashboardstringyesPattern: ^[a-zA-Z0-9_-]{1,32}$A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters.
descriptionstringnoMaximum length: 255
functionsanyno
namestringyesLength: 1 to 255
placeholdersanyno
propertiesanyno
sourcestringnoOne of: widgets, url
tabsarray of anyno
urlstringnoMaximum length: 1024
Pattern: ^(/[^/\\]|https://)
widgetsarray of anyno

Example request: Empty widget dashboard

bash
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "dashboard": "plant_overview",
  "description": "Production KPIs",
  "name": "Plant overview",
  "tabs": [
    {
      "icon": "fas fa-tachometer-alt",
      "name": "Main",
      "widgets": []
    }
  ]
}'

Example body: Url dashboard (SDK app)

json
{
  "dashboard": "fleet",
  "description": "Device list and detail app",
  "name": "Fleet",
  "source": "url",
  "url": "/v1/users/YOUR_USER/storages/fleet_app/files/"
}

Responses

StatusDescription
200ok
401unauthorized
403forbidden

GET /v1/users/{user}/dashboards/{dashboard} ​

  • Request: GET /v1/users/{user}/dashboards/
  • Operation: ReadDashboardConfig
  • Operation ID: Dashboard_ReadConfig
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Example request

bash
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Responses

StatusDescription
200ok
401unauthorized
403forbidden

Response example (200, Empty widget dashboard)

json
{
  "created": 1792263090743,
  "dashboard": "plant_overview",
  "description": "Production KPIs",
  "modified": 1792263090743,
  "name": "Plant overview",
  "tabs": [
    {
      "icon": "fas fa-tachometer-alt",
      "name": "Main",
      "widgets": []
    }
  ]
}

Response example (200, Url dashboard (SDK app))

json
{
  "created": 1792263090743,
  "dashboard": "fleet",
  "description": "Device list and detail app",
  "modified": 1792263090743,
  "name": "Fleet",
  "source": "url",
  "url": "/v1/users/YOUR_USER/storages/fleet_app/files/"
}

PUT /v1/users/{user}/dashboards/{dashboard} ​

  • Request: PUT /v1/users/{user}/dashboards/
  • Operation: UpdateDashboard
  • Operation ID: Dashboard_Update
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Request body (application/json, required)

FieldTypeRequiredConstraintsDescription
controlsanyno
descriptionstringnoMaximum length: 255
functionsanyno
namestringnoLength: 1 to 255
placeholdersanyno
propertiesanyno
sourcestringnoOne of: widgets, url
tabsarray of anyno
urlstringnoMaximum length: 1024
Pattern: ^(/[^/\\]|https://)
widgetsarray of anyno

Example request: Point to another entry file

bash
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "source": "url",
  "url": "/v1/users/YOUR_USER/storages/fleet_app/files/device.html"
}'

Example body: Rename

json
{
  "description": "Production KPIs",
  "name": "Plant overview (2026)"
}

Responses

StatusDescription
200ok
401unauthorized
403forbidden

DELETE /v1/users/{user}/dashboards/{dashboard} ​

  • Request: DELETE /v1/users/{user}/dashboards/
  • Operation: DeleteDashboard
  • Operation ID: Dashboard_Delete
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Example request

bash
curl -X DELETE 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Responses

StatusDescription
200ok
401unauthorized
403forbidden

GET /v1/users/{user}/dashboards/{dashboard}/clone ​

  • Request: GET /v1/users/{user}/dashboards/{dashboard}/clone
  • Operation: CloneDashboardConfig
  • Operation ID: Dashboard_CloneConfig
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Example request

bash
curl 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD/clone' \
  -H 'Authorization: Bearer YOUR_TOKEN'

Responses

StatusDescription
200ok
401unauthorized
403forbidden

POST /v1/users/{user}/dashboards/{dashboard}/clone ​

  • Request: POST /v1/users/{user}/dashboards/{dashboard}/clone
  • Operation: CloneDashboard
  • Operation ID: Dashboard_Clone
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Request body (application/json, required)

FieldTypeRequiredConstraintsDescription
dashboardstringyesPattern: ^[a-zA-Z0-9_-]{1,32}$A unique identifier for resources, consisting of alphanumeric characters, underscores, or hyphens, and limited to 32 characters.
descriptionstringnoMaximum length: 255A brief description of the resource, providing context or additional information, limited to 255 characters.
enabledbooleanno
namestringnoMaximum length: 255The name of the resource, limited to 255 characters. It can include any character.

Example request: Copy with a new id

bash
curl -X POST 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD/clone' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "dashboard": "copy_of_dashboard"
}'

Example body: Copy with name and description

json
{
  "dashboard": "line_2_dashboard",
  "description": "Same configuration as the original, for production line 2",
  "name": "Line 2 copy"
}

Responses

StatusDescription
200ok
401unauthorized
403forbidden

PUT /v1/users/{user}/dashboards/{dashboard}/projects ​

  • Request: PUT /v1/users/{user}/dashboards/{dashboard}/projects
  • Operation: UpdateDashboardProjects
  • Operation ID: Dashboard_UpdateProjects
  • Authentication: access token, Authorization: Bearer YOUR_TOKEN

Parameters

NameInTypeRequiredDescription
userpathstringyes
dashboardpathstringyes

Request body (application/json, required)

FieldTypeRequiredConstraintsDescription
(body)array of stringnoProjects 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

bash
curl -X PUT 'https://YOUR_SERVER/v1/users/YOUR_USER/dashboards/YOUR_DASHBOARD/projects' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '[]'

Example body: One project

json
[
  "YOUR_USER@greenhouse"
]

Example body: Two projects

json
[
  "YOUR_USER@greenhouse",
  "YOUR_USER@maintenance"
]

Responses

StatusDescription
200ok
401unauthorized
403forbidden