A valid request URL is required to generate request examples{
"success": true,
"data": {
"id": "dsh_9a12",
"name": "My billing board",
"ownerUserId": "user_2abc",
"surface": "observe",
"scope": {
"channel": "voice"
},
"widgets": [
{
"id": "w_1a2b",
"metricId": "containment",
"viz": "kpi",
"span": 6
},
{
"id": "w_3c4d",
"metricId": "topics",
"viz": "columns",
"span": 14
}
],
"isStock": false,
"createdAt": "2026-07-12T09:00:00.000Z",
"updatedAt": "2026-07-12T09:00:00.000Z"
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Create a dashboard
Create a new user-owned dashboard. Body: { name, scope?, widgets[] }. Every widget is validated against the metric registry: metricId must exist (422 with the offending id) and viz must be one of that metric’s allowedViz (422; an empty viz defaults to the metric’s defaultViz). span is clamped to the 2..20 grid and a widget without an id is assigned one. The board is owned by the acting user; a stock board can never be created via the API.
A valid request URL is required to generate request examples{
"success": true,
"data": {
"id": "dsh_9a12",
"name": "My billing board",
"ownerUserId": "user_2abc",
"surface": "observe",
"scope": {
"channel": "voice"
},
"widgets": [
{
"id": "w_1a2b",
"metricId": "containment",
"viz": "kpi",
"span": 6
},
{
"id": "w_3c4d",
"metricId": "topics",
"viz": "columns",
"span": 14
}
],
"isStock": false,
"createdAt": "2026-07-12T09:00:00.000Z",
"updatedAt": "2026-07-12T09:00:00.000Z"
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
Flowyte secret API key (Authorization: Bearer flowyte_sk_live_…). Scope-gated; is scoped to your organization — a key can never reach another tenant. The listed scopes in each operation's apiKey requirement are the scopes that key must hold. The tokenUrl is nominal: keys are minted in the dashboard.
Body
The create/update body. On update this is a FULL-DOCUMENT replace: ALWAYS send the COMPLETE widgets[] array (the server stores it verbatim after validation), never a delta. name is required; scope is optional (defaults to {}). Each widget's metricId must exist and viz must be in that metric's allowedViz (else 422).
Response
The created dashboard.
A saved dashboard document. widgets is the complete ordered widget list (replaced whole on every write). scope holds dashboard-level default filters applied beneath each widget's own scope. isStock marks a product-shipped board that is read-only via the API (updateDashboard/deleteDashboard return 409).
Show child attributes
Show child attributes
Show child attributes
Show child attributes