Dashboards API
Read dashboards with the Dashboards API, see which changes need the owner, and manage widgets, layout and sharing with each endpoint.
A dashboard is a set of widgets that chart your tables. Each widget is a component spec whose figures come from table reads; the component format is in the dashboard component reference.
| Scope | Endpoints |
|---|---|
dashboards:read (or legacy workflows:read) | List, get, check a spec, list shares |
dashboards:write (or legacy workflows:write) | Create, update, delete, layout, widgets, sharing |
These endpoints are not in the OpenAPI specification.
Who can do what
A dashboard belongs to the user who created it. Changes (update, delete, layout, widgets and sharing) are allowed only for that owner. Other users in the company can read it when it is shared with the company or with them.
An API key acts for the company, not for a user. With an API key you can list and read dashboards shared with the company. Owner-only endpoints return 404 for an API key. A dashboard created with an API key has no owner, so it cannot be read back or changed with the key. Build and edit dashboards in Studio or through MCP, and use the API key to read them.
Dashboard object
| Field | Type | Meaning |
|---|---|---|
id | string (UUID) | |
name | string | 1 to 200 characters |
description | string or null | Up to 2,000 characters |
layout | object | Grid layout |
settings | object | Board-wide number formatting, see below |
companyAccess | boolean | Whether everyone in the company can view it |
isPublished, publishedAt, revokedAt, shareExpiresAt | Public link state | |
userId, ownerName, ownerEmail | The owner | |
accessReason | string or null | Why you can see it: owner, company or invited |
widgets | object[] | Get only. Each has id, dashboardId, kind, config (version, title, spec), position, createdAt and updatedAt |
createdAt, updatedAt | string (ISO 8601) |
Settings
| Field | Values | Default |
|---|---|---|
locale | BCP-47 tag, for example en-US | en-US |
currency | ISO 4217 code. Display only, no conversion | USD |
negative | minus or parentheses | minus |
fiscalYearStartMonth | 1 to 12 | 1 |
density | compact or comfortable | compact |
List and get
GET /api/v1/dashboards
GET /api/v1/dashboards/{id}List returns every dashboard you can view, most recently updated first, without widgets. Get returns one dashboard with its widgets.
curl 'https://workflow.loopfour.ai/api/v1/dashboards' \
-H 'x-api-key: wfk_live_your_api_key'{
"success": true,
"data": [
{
"id": "6a2f9c1d-4e3b-4b7a-9d81-2c5e7f0a3b96",
"name": "Month-end close",
"description": "AR, AP and cash at a glance",
"layout": {},
"settings": { "currency": "USD", "negative": "parentheses" },
"publishedAt": null,
"isPublished": false,
"revokedAt": null,
"shareExpiresAt": null,
"companyAccess": true,
"userId": "3b7e1f2a-9c4d-4e6b-8a10-5d2c7f9e1a42",
"createdAt": "2026-01-20T10:00:00.000Z",
"updatedAt": "2026-02-10T16:30:00.000Z",
"accessReason": "company",
"ownerName": "Jordan Lee",
"ownerEmail": "jordan@example.com"
}
]
}A dashboard you cannot view returns 404.
Create, update and delete
POST /api/v1/dashboards
PATCH /api/v1/dashboards/{id}
DELETE /api/v1/dashboards/{id}| Field | Type | Meaning |
|---|---|---|
name | string | Required on create. 1 to 200 characters |
description | string or null | Up to 2,000 characters |
layout | object | |
settings | object | Only the keys you send change. Unknown keys return 400 |
Create returns 201. Update returns the dashboard. Delete removes it and returns { "id": "..." }.
Widgets and layout
POST /api/v1/dashboards/{id}/widgets
PATCH /api/v1/dashboards/{id}/widgets/{widgetId}
DELETE /api/v1/dashboards/{id}/widgets/{widgetId}
PUT /api/v1/dashboards/{id}/layout| Field | Meaning |
|---|---|
config.version | 1 |
config.title | Optional, up to 120 characters |
config.spec | Component spec, see the dashboard component reference |
position | Create: optional { "w", "h" } size hints (1 to 12). Update: a full { "x", "y", "w", "h" } |
Update replaces the whole config; it does not merge a partial spec. Send at least one of config or position. The request body is limited to 1 MB. Layout takes { "widgets": [{ "id", "x", "y", "w", "h" }] } with unique widget IDs.
Every spec is checked before it is saved: it must match the component catalog, every table must belong to your company, and every column must exist. An invalid spec returns 400. A dashboard holds at most 40 widgets, 200 table reads across its widgets and 2 MB of specs; going over returns 409.
Check a spec
POST /api/v1/dashboards/specs/checkSend { "spec": { ... } }. Runs the same checks without saving and returns { "ok": true } or { "ok": false, "issues": ["..."] }.
Sharing
PATCH /api/v1/dashboards/{id}/share
GET /api/v1/dashboards/{id}/shares
POST /api/v1/dashboards/{id}/shares
DELETE /api/v1/dashboards/{id}/shares/{userId}PATCH .../share takes action:
action | Extra field | Effect |
|---|---|---|
publish | Turns on the public read-only link | |
unpublish | Turns the public link off | |
revoke | Ends the current link for good. Publishing again creates a new link | |
setExpiry | expiresAt (ISO 8601 or null) | Sets when the link stops working. A time in the past returns 400 |
setCompanyAccess | companyAccess (boolean) | Lets everyone in the company view the dashboard |
All sharing endpoints are owner-only. POST .../shares invites one person in your company by userId or email; an unknown person returns 404. GET .../shares lists the people invited, and DELETE .../shares/{userId} removes one.
For sharing from Studio, see Dashboards.
Errors
| Status | Code | Cause |
|---|---|---|
400 | BAD_REQUEST | Invalid spec, unknown settings key, missing field for a share action |
400 | ZodError in error.name | Body does not match the schema |
401 | UNAUTHORIZED | Missing or invalid API key |
403 | FORBIDDEN | Key lacks the scope |
404 | NOT_FOUND | Dashboard or widget not found, or you are not its owner |
409 | CONFLICT | A dashboard cap was reached |
Tables API
Create tables, define columns and read or write rows with the Tables API, with the parameters, request bodies and responses of each endpoint.
Connections API
List the connections of your company and check their status with the Connections API, with the parameters and responses for each endpoint.
Loopfour