---
title: "Answer a dashboard’s questions"
method: GET
path: "/api/v1/rest/bi/dashboards/{id}/results"
tags: ["Business Intelligence"]
---

# Answer a dashboard’s questions

`GET /api/v1/rest/bi/dashboards/{id}/results`

## Request

- Base URL: `https://api.custodo.ai`
- URL: `https://api.custodo.ai/api/v1/rest/bi/dashboards/{id}/results`
- Auth: HTTP bearer

Runs a saved dashboard and returns its NUMBERS: per widget the unit, the total and up to `row_limit` buckets (50 at most, and the total always sums EVERY bucket, including those past the cut), all measured on one clock inside one transaction. Every widget is re-queried AS YOU — one whose module, permission or tier you lack comes back `unavailable` with the reason, and one whose provider failed comes back `degraded`, never as a zero, which is also why a colleague’s shared board can never leak a figure. At most 6 widgets per call: pass `widgets` to choose which, read bi_get_dashboard first to see what the board asks, and use custodo_query_analytics for a question nobody saved. Returns data, never layout — no chart type, no position, no colours.

**Examples**

- Give me the numbers from the «Direzione» dashboard
  `GET /api/v1/rest/bi/dashboards/11111111-2222-4333-8444-555555555555/results`
- Just the first two cards, for last month
  `GET /api/v1/rest/bi/dashboards/11111111-2222-4333-8444-555555555555/results?widgets=w1&widgets=w2&range=this_month`
- Read the board the way the «Milano» view reads it
  `GET /api/v1/rest/bi/dashboards/11111111-2222-4333-8444-555555555555/results?view=Milano&response_format=detailed`

## Path parameters

- `id` string, uuid, required

## Query parameters

- `widgets` string[]
- `view` string
- `range` 'last_7_days' | 'last_30_days' | 'last_90_days' | 'last_12_months' | 'this_month' | 'this_year' | 'all_time' | 'custom'
- `from` string
- `to` string
- `row_limit` integer
- `response_format` 'concise' | 'detailed'

## Headers

- `X-Tenant-Id` string, uuid

## Response `200`

Done. `data` is the tool’s own answer.

- RestResult
  - `ok` true, required
  - `data` unknown, required

## Other responses

- `400`: The arguments did not validate: `error.message` names the field, what it expects and what arrived.
- `401`: No API key, or one that is malformed, unknown, revoked or expired.
- `403`: The call never ran: the module is off for this organisation, the credential lacks the permission or the module, the tier does not cover it, or the tool is destructive and the key was not minted for that.
- `404`: Nothing with that id in this organisation.
- `422`: The tool ran and refused, in a sentence of its own (`TOOL_REFUSED`): the message says what to change. Retrying the same call will not help.
- `429`: The API key has spent its minute, or its day. Every request a key makes counts. See `Retry-After`.

---

[API](https://skmtc.dev/custodo/apis/custodo-integrazioni.md) · [All operations](https://skmtc.dev/custodo/apis/custodo-integrazioni/llms.txt) · [OpenAPI document](https://skmtc.dev/custodo/apis/custodo-integrazioni/revisions/16d336d3ec2a?raw)
