Dashboards reference
Requires a paid plan. See plan limits.
Time range syntax
Section titled “Time range syntax”The time picker takes a preset, a calendar range or typed text.
Presets
Section titled “Presets”15m, 1h, 4h, 1d, 2d, 7d, 30d and 90d. Each is a sliding window that ends now.
Typed input
Section titled “Typed input”| You type | Meaning |
|---|---|
3h, 90m, 2d | A number and a unit. The last 3 hours, 90 minutes or 2 days. |
today, yesterday | That calendar day. |
this week, last week | That calendar week. |
since Oct 1 | From that date until now. The range grows as time passes. |
Oct 1 - Oct 3 | A fixed range between two dates. |
| Two ISO 8601 timestamps | A fixed range between them. |
The maximum window is 400 days.
Moving through time
Section titled “Moving through time”- 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
zto 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.
Timezone
Section titled “Timezone”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.
API range grammar
Section titled “API range grammar”The API takes a range as { "from": ..., "to": ... }, where each bound is one of:
| Form | Example |
|---|---|
now | now |
now-<n><unit>, with unit s, m, h, d or w | now-24h |
| An RFC 3339 timestamp | 2026-10-01T00:00:00Z |
| Epoch milliseconds | 1760112000000 |
Refresh
Section titled “Refresh”The refresh setting is auto, off, 30s, 1m, 5m or 15m. With auto, the cadence follows the range:
| Range | Refreshes every |
|---|---|
| 15m | 10 seconds |
| 1h | 30 seconds |
| 4h | 1 minute |
| 1d | 2 minutes |
| 2d | 5 minutes |
| 7d | 15 minutes |
| Longer than 7d | 1 hour |
Refresh pauses while the tab is hidden, and only widgets that are on screen query. Query results are cached for 30 seconds.
URL parameters
Section titled “URL parameters”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
| Parameter | Example | Meaning |
|---|---|---|
from, to | now-24h, now | The time range, in the range grammar. |
tz | UTC | Timezone: UTC or an IANA zone. |
live | 1 | Whether the range is live (1) or paused. |
refresh | auto | One of auto, off, 30s, 1m, 5m, 15m. |
var-<name> | var-region=us-east-1,eu-west-1 | A variable’s selection. Several values are comma-separated. |
edit | 1 | Open in edit mode. |
tv | 1 | Open in TV mode. |
w | w=<widget id> | Open that widget full screen. |
Any parameter you leave out falls back to the dashboard’s own settings.
Keyboard shortcuts
Section titled “Keyboard shortcuts”On Windows and Linux, use Ctrl where the table says Cmd.
| Keys | Action |
|---|---|
e | Edit the dashboard. |
Esc | Leave edit mode, or close the open side panel. |
Cmd+S | Save. |
Cmd+Z | Undo. |
Shift+Cmd+Z | Redo. |
Cmd+C, Cmd+V | Copy and paste the focused widget. |
[, ] | Step the time range back and forward by one window. |
z | Zoom the time range out. |
/ | Focus the search box on the dashboards list. |
Limits
Section titled “Limits”Dashboard
Section titled “Dashboard”| Limit | Value |
|---|---|
| Widgets per dashboard (section children included) | 100 |
| Variables per dashboard | 20 |
| Definition JSON size | 512 KiB |
| Name | 200 characters |
| Versions kept per dashboard | The newest 200 |
| Recently deleted | Restorable for 30 days, then purged |
| Grid | 12 columns, widget height 1 to 48 rows |
Widget
Section titled “Widget”| Limit | Value |
|---|---|
Widget id | 1 to 32 characters of A-Z, a-z, 0-9, _, - |
| Title | 200 characters |
| Description | 2,000 characters |
| Queries | 10 (a to j) |
| Formulas | 5 (f1 to f5), 256 characters each |
| Group by fields per query | 2 |
| Values per filter | 1 to 50, up to 512 characters each |
Time series series_limit | Default 10, max 50 |
Top list limit | Default 10, max 100 |
Table limit | Max 500 |
Pie limit | Max 12, the rest as “Other” |
Uptime bars days | 30, 60 or 90 |
Uptime bars limit | Default 10, max 50 |
Incidents limit | Max 100 |
Log stream limit | Max 200 |
Trace list limit | Max 100 |
Note markdown | 10,000 characters |
Variable
Section titled “Variable”| Limit | Value |
|---|---|
name | ^[a-z][a-z0-9_]{0,31}$ |
Queries
Section titled “Queries”| Limit | Value |
|---|---|
| Longest time window | 400 days |
Points per series (max_points) | 240 by default, 30 to 600 |
| Widgets per query request | 1 to 50 |
| Time for one widget | 15 seconds, then it shows a timeout |
| Values in a variable dropdown | 100 |
Roles and permissions
Section titled “Roles and permissions”Everyone in an account can view its dashboards. What else you can do depends on your role.
| Action | Viewer, Auditor | Member, Billing Admin | Admin, Super Admin |
|---|---|---|---|
| List, open and export | Yes | Yes | Yes |
| Load widget data | Yes | Yes | Yes |
| Create, clone, import, create from a template | No | Yes | Yes |
| Edit, restore a version | No | Yes | Yes |
| Delete, restore a deleted dashboard | No | Yes | Yes |
| Create share links | No | Yes | Yes |
| Manage existing share links | No | Yes | Yes |
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.
API endpoints
Section titled “API endpoints”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.
| Method | Path | What it does |
|---|---|---|
GET | /dashboards | List. Filter with search, tag, favorites, mine, deleted. Sort with sort (viewed, updated, name). Page with limit (max 200) and offset. |
POST | /dashboards | Create. name is required. A blank dashboard is made when definition is absent. |
GET | /dashboards/ | Get one, with its definition. |
PUT | /dashboards/ | 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/ | Soft delete. Returns 204. |
POST | /dashboards/ | Restore a deleted dashboard. |
POST | /dashboards/ | Copy a dashboard. name is optional. |
GET | /dashboards/ | Export as JSON. |
POST | /dashboards/ | Create a dashboard from an export. The definition is validated. |
GET | /dashboards/ | List versions with author, time and summary. |
GET | /dashboards/ | Get one version in full. |
POST | /dashboards/ | Restore a version as a new version. Send the current version. |
PUT, DELETE | /dashboards/ | Star or unstar. For signed-in users only. |
GET | /dashboards/ | List the built-in templates, each with has_data. |
POST | /dashboards/ | Create a dashboard from a template. name is optional. |
GET | /dashboards/ | The sources, measures and fields. |
GET | /dashboards/ | Field values for dropdowns. Takes source, field, q, metric, limit. |
POST | /dashboards/ | Run widget queries. |
GET, POST | /dashboards/ | List or create share links. |
PATCH, DELETE | /dashboards/ | Pause, set expiry or settings. Or revoke. |
GET | /public/ | A shared dashboard. No authentication. |
POST | /public/ | Queries 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.
Assistants and MCP
Section titled “Assistants and MCP”An assistant connected through MCP can build dashboards with call_api. The share endpoints are withheld from MCP, so an assistant cannot publish data.
Running queries
Section titled “Running queries”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:
status | Meaning |
|---|---|
ok | data holds the result. |
error | The query failed. error holds a message that is safe to show. |
timeout | The widget ran past its 15 second budget. |
denied | The 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.kind | Used by |
|---|---|
timeseries | Time series |
scalar | Query value |
grouped | Top list, Table, Pie |
monitors | Monitor grid |
monitor_summary | Monitor status |
uptime_bars | Uptime bars |
incidents | Incidents |
expiry | Certificate and domain expiry |
logs | Log stream |
traces | Trace list |
rum_vitals | Web Vitals |
JSON export format
Section titled “JSON export format”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" } } ] }}Top level
Section titled “Top level”| Field | Description |
|---|---|
schema | Always siteqwality.dashboard/. |
name, description, tags | The dashboard’s metadata. |
definition | The dashboard document, below. |
The definition
Section titled “The definition”| Field | Description |
|---|---|
schema_version | 1. |
settings.default_time | The default range, as {from, to} in the range grammar. |
settings.refresh | auto, off, 30s, 1m, 5m or 15m. |
settings.timezone | null to follow the viewer’s browser, "UTC", or an IANA zone. |
settings.crosshair | shared or off. |
variables | Up to 20. See variables. |
widgets | Up 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.