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": 8
},
{
"id": "w_5e6f",
"metricId": "transfers",
"viz": "kpi",
"span": 6
}
],
"isStock": false,
"createdAt": "2026-07-12T09:00:00.000Z",
"updatedAt": "2026-07-12T10:30: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>"
}
]
}{
"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>"
}
]
}Update a dashboard (full-document replace)
Replace a dashboard’s name, scope, and widgets. This is a FULL-DOCUMENT replace — ALWAYS send the COMPLETE widgets[] array, not a delta. There is no per-widget endpoint: adding, moving, resizing, or removing a widget all mean sending the whole new widget list here. The server stores the array verbatim after the same registry validation as createDashboard (unknown metricId / illegal viz → 422; span clamped 2..20). Stock boards are read-only → 409 (customizing one creates a copy). 404 if the dashboard is absent/cross-org.
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": 8
},
{
"id": "w_5e6f",
"metricId": "transfers",
"viz": "kpi",
"span": 6
}
],
"isStock": false,
"createdAt": "2026-07-12T09:00:00.000Z",
"updatedAt": "2026-07-12T10:30: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>"
}
]
}{
"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.
Path Parameters
The dashboard id (from listDashboards / createDashboard).
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 updated 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