Skip to content

Dashboards reference

Requires a paid plan. See plan limits.

The time picker takes a preset, a calendar range or typed text.

15m, 1h, 4h, 1d, 2d, 7d, 30d and 90d. Each is a sliding window that ends now.

You typeMeaning
3h, 90m, 2dA number and a unit. The last 3 hours, 90 minutes or 2 days.
today, yesterdayThat calendar day.
this week, last weekThat calendar week.
since Oct 1From that date until now. The range grows as time passes.
Oct 1 - Oct 3A fixed range between two dates.
Two ISO 8601 timestampsA fixed range between them.

The maximum window is 400 days.

  • Live and paused. A live range slides with the clock. A paused range stays fixed.
  • Step. Move back or forward by one window with [ and ].
  • Zoom out. Press z to widen the range.
  • Zoom in. Drag across any time chart. Back returns to the previous range.
  • Default range. The dashboard stores a default. Viewers never overwrite it. In edit mode, choose Save as default time to set it from the current range, then Save.

Times show in your browser’s timezone, in UTC, or in the dashboard’s own IANA zone, such as America/New_York. The dashboard setting timezone is null to follow the browser, "UTC", or a zone name. Day-sized buckets align to midnight in the zone being shown.

The API takes a range as { "from": ..., "to": ... }, where each bound is one of:

FormExample
nownow
now-<n><unit>, with unit s, m, h, d or wnow-24h
An RFC 3339 timestamp2026-10-01T00:00:00Z
Epoch milliseconds1760112000000

The refresh setting is auto, off, 30s, 1m, 5m or 15m. With auto, the cadence follows the range:

RangeRefreshes every
15m10 seconds
1h30 seconds
4h1 minute
1d2 minutes
2d5 minutes
7d15 minutes
Longer than 7d1 hour

Refresh pauses while the tab is hidden, and only widgets that are on screen query. Query results are cached for 30 seconds.

The dashboard URL carries its view state. A link you copy reproduces the view.

/dashboards/<id>?from=now-24h&to=now&tz=UTC&live=1&refresh=auto&var-region=us-east-1,eu-west-1

ParameterExampleMeaning
from, tonow-24h, nowThe time range, in the range grammar.
tzUTCTimezone: UTC or an IANA zone.
live1Whether the range is live (1) or paused.
refreshautoOne of auto, off, 30s, 1m, 5m, 15m.
var-<name>var-region=us-east-1,eu-west-1A variable’s selection. Several values are comma-separated.
edit1Open in edit mode.
tv1Open in TV mode.
ww=<widget id>Open that widget full screen.

Any parameter you leave out falls back to the dashboard’s own settings.

On Windows and Linux, use Ctrl where the table says Cmd.

KeysAction
eEdit the dashboard.
EscLeave edit mode, or close the open side panel.
Cmd+SSave.
Cmd+ZUndo.
Shift+Cmd+ZRedo.
Cmd+C, Cmd+VCopy and paste the focused widget.
[, ]Step the time range back and forward by one window.
zZoom the time range out.
/Focus the search box on the dashboards list.
LimitValue
Widgets per dashboard (section children included)100
Variables per dashboard20
Definition JSON size512 KiB
Name200 characters
Versions kept per dashboardThe newest 200
Recently deletedRestorable for 30 days, then purged
Grid12 columns, widget height 1 to 48 rows
LimitValue
Widget id1 to 32 characters of A-Z, a-z, 0-9, _, -
Title200 characters
Description2,000 characters
Queries10 (a to j)
Formulas5 (f1 to f5), 256 characters each
Group by fields per query2
Values per filter1 to 50, up to 512 characters each
Time series series_limitDefault 10, max 50
Top list limitDefault 10, max 100
Table limitMax 500
Pie limitMax 12, the rest as “Other”
Uptime bars days30, 60 or 90
Uptime bars limitDefault 10, max 50
Incidents limitMax 100
Log stream limitMax 200
Trace list limitMax 100
Note markdown10,000 characters
LimitValue
name^[a-z][a-z0-9_]{0,31}$
LimitValue
Longest time window400 days
Points per series (max_points)240 by default, 30 to 600
Widgets per query request1 to 50
Time for one widget15 seconds, then it shows a timeout
Values in a variable dropdown100

Everyone in an account can view its dashboards. What else you can do depends on your role.

ActionViewer, AuditorMember, Billing AdminAdmin, Super Admin
List, open and exportYesYesYes
Load widget dataYesYesYes
Create, clone, import, create from a templateNoYesYes
Edit, restore a versionNoYesYes
Delete, restore a deleted dashboardNoYesYes
Create share linksNoYesYes
Manage existing share linksNoYesYes

A locked dashboard can be edited only by its creator, Admins and Super Admins.

Scoped API keys, M2M clients and connected apps need read:dashboards to read dashboards and write:dashboards to change them. POST /dashboards/query is a read operation.

Loading widget data also requires each source’s read scope: read:monitors, read:incidents, read:rum, read:logs, read:metrics or read:traces. Overlays count too: incident overlays need read:incidents, and downtime overlays need read:monitors. A write scope does not imply read access. Widgets missing a required scope return denied while other widgets still run. Creating or saving a dashboard and managing its share links requires read access to all sources used by its widgets.

Endpoints are served from https://api.siteqwality.com. Authenticate with Authorization: Bearer <API key>. Request and response schemas are in the Dashboards group of the API Reference.

MethodPathWhat it does
GET/dashboardsList. Filter with search, tag, favorites, mine, deleted. Sort with sort (viewed, updated, name). Page with limit (max 200) and offset.
POST/dashboardsCreate. name is required. A blank dashboard is made when definition is absent.
GET/dashboards/{id}Get one, with its definition.
PUT/dashboards/{id}Update. Send the version you loaded. A stale version returns 409 with the current dashboard. A locked dashboard returns 403 to anyone except its creator and admins.
DELETE/dashboards/{id}Soft delete. Returns 204.
POST/dashboards/{id}/restoreRestore a deleted dashboard.
POST/dashboards/{id}/cloneCopy a dashboard. name is optional.
GET/dashboards/{id}/exportExport as JSON.
POST/dashboards/importCreate a dashboard from an export. The definition is validated.
GET/dashboards/{id}/versionsList versions with author, time and summary.
GET/dashboards/{id}/versions/{version}Get one version in full.
POST/dashboards/{id}/versions/{version}/restoreRestore a version as a new version. Send the current version.
PUT, DELETE/dashboards/{id}/favoriteStar or unstar. For signed-in users only.
GET/dashboards/templatesList the built-in templates, each with has_data.
POST/dashboards/templates/{key}Create a dashboard from a template. name is optional.
GET/dashboards/catalogThe sources, measures and fields.
GET/dashboards/valuesField values for dropdowns. Takes source, field, q, metric, limit.
POST/dashboards/queryRun widget queries.
GET, POST/dashboards/{id}/sharesList or create share links.
PATCH, DELETE/dashboards/{id}/shares/{share_id}Pause, set expiry or settings. Or revoke.
GET/public/dashboards/{token}A shared dashboard. No authentication.
POST/public/dashboards/{token}/queryQueries for a shared dashboard. No authentication.

Template keys are uptime-overview, monitor-deep-dive, incident-reliability, rum-web-vitals, logs-overview, service-health and executive-summary.

An assistant connected through MCP can build dashboards with call_api. The share endpoints are withheld from MCP, so an assistant cannot publish data.

POST /dashboards/query evaluates widgets without saving anything. Send a time range, an optional timezone, the variable selections and 1 to 50 widgets:

{
"time": { "from": "now-24h", "to": "now" },
"timezone": "America/New_York",
"variables": { "region": ["us-east-1"] },
"widgets": [
{
"widget": {
"id": "p95",
"type": "timeseries",
"layout": { "x": 0, "y": 0, "w": 6, "h": 4 },
"config": {
"queries": [
{
"id": "a",
"source": "monitors",
"measure": "response_time",
"aggregation": "p95",
"filters": [{ "field": "region", "op": "in", "values": ["$region"] }]
}
]
}
},
"max_points": 240
}
]
}

The whole request is validated first. A bad request returns 400 and names the path, such as widgets[2].config.queries[0].filters[1]. After that, widgets run independently. Each result has a status:

statusMeaning
okdata holds the result.
errorThe query failed. error holds a message that is safe to show.
timeoutThe widget ran past its 15 second budget.
deniedThe caller cannot use the widget, for example because a source read scope or access to a RUM application is missing.

Results also carry the resolved window (from, to, interval_seconds), an approximate flag and warnings. When status is ok, data.kind says which shape follows:

data.kindUsed by
timeseriesTime series
scalarQuery value
groupedTop list, Table, Pie
monitorsMonitor grid
monitor_summaryMonitor status
uptime_barsUptime bars
incidentsIncidents
expiryCertificate and domain expiry
logsLog stream
tracesTrace list
rum_vitalsWeb Vitals

Export JSON in the actions menu, and GET /dashboards/{id}/export, produce a document you can store, review in a pull request or import into another account. New dashboard → Import JSON and POST /dashboards/import read it back and create a new dashboard. The definition is validated against every limit on this page.

{
"schema": "siteqwality.dashboard/v1",
"name": "API health",
"description": "Latency and failures for the public API",
"tags": ["platform"],
"definition": {
"schema_version": 1,
"settings": {
"default_time": { "from": "now-24h", "to": "now" },
"refresh": "auto",
"timezone": null,
"crosshair": "shared"
},
"variables": [
{
"name": "region",
"label": "Region",
"source": "monitors",
"field": "region",
"multi": true,
"include_all": true,
"default": ["*"]
}
],
"widgets": [
{
"id": "p95",
"type": "timeseries",
"title": "p95 response time by region",
"layout": { "x": 0, "y": 0, "w": 8, "h": 4 },
"config": {
"queries": [
{
"id": "a",
"source": "monitors",
"measure": "response_time",
"aggregation": "p95",
"filters": [{ "field": "region", "op": "in", "values": ["$region"] }],
"group_by": ["region"]
}
],
"overlays": ["incidents"]
}
},
{
"id": "fail",
"type": "query_value",
"title": "Failure rate",
"layout": { "x": 8, "y": 0, "w": 4, "h": 4 },
"config": {
"queries": [
{ "id": "a", "source": "monitors", "measure": "checks", "hidden": true },
{ "id": "b", "source": "monitors", "measure": "failed_checks", "hidden": true }
],
"formulas": [{ "id": "f1", "expr": "b / a * 100", "unit": "percent" }],
"compare": "previous_period",
"higher_is": "worse"
}
}
]
}
}
FieldDescription
schemaAlways siteqwality.dashboard/v1.
name, description, tagsThe dashboard’s metadata.
definitionThe dashboard document, below.
FieldDescription
schema_version1.
settings.default_timeThe default range, as {from, to} in the range grammar.
settings.refreshauto, off, 30s, 1m, 5m or 15m.
settings.timezonenull to follow the viewer’s browser, "UTC", or an IANA zone.
settings.crosshairshared or off.
variablesUp to 20. See variables.
widgetsUp to 100, in reading order (by y, then x). Each has id, type, optional title, description and time, a layout and a config. See widgets.

A collapsed section keeps its widgets in config.children, so they are not at the top level.