tile_changes, layout_changes and the layout as it now
stands. Pass at least one of name, description, reports or layout_rows.
Removing a tile is done in the web app.
reports adds each report as the tiles it can render: a chart and a pivot table
make two tiles, a report with neither is skipped. visualization_types narrows
that to one of them. layout_rows is applied after the reports are added, so
one call can add and place them, naming new tiles by report_id; it is the
whole arrangement, and a tile left out is kept, not removed.
A report’s visualization_types narrows the tiles it adds to its chart or its
pivot table; list_reports names what
each report can render in its available_visualizations. A new tile has no
visualization_id yet, so name it by its report_id in layout_rows. A tile
you leave out of layout_rows goes after the others, one per row, and an empty
list resets the page, one tile per row.
Adding and arranging never fail over one bad entry: they do what they can and
say so per row. Read the outcome of every tile_changes and
layout_changes row before reporting success. A report can come back
not_found, no_visualization when it has no chart or pivot table yet,
already_added, or type_not_available for each type you asked for that it
does not offer, even when its other tile was added.
Read the returned layout rather than assuming your rows were kept as sent: a
row holds at most three charts, or two tiles when one is a pivot table, and one
that overflows is split.
You need write access on the dashboard itself. A dashboard shared with you
read-only is refused with a message saying the share is read-only; pick one
you can edit from list_dashboards,
or create a new one with
create_dashboard. A dashboard
you cannot read at all is refused as not found.
Every write to the live environment is recorded in the audit trail as the Qobra MCP agent; writes to a sandbox are not audited.
Parameters
Body
Body
string
required
Id from list_dashboards or create_dashboard. The dashboard names its
environment: there is no sandbox_id.
string
New name. Omit to keep the current one.
string
New free-text note about what the dashboard is for. Omit to keep the current
one; "" clears it.
object[]
Reports to add, each as every tile it can render (chart, pivot table or
both) unless its visualization_types narrows it. Omit to leave the tiles
untouched.
string[][]
The whole arrangement, rows top to bottom, each row’s tiles left to right.
An entry is a visualization_id from get_dashboard, or a report_id (every
tile of that report: the only way to place tiles this same call adds). A row
holds at most three charts, or two tiles when one is a pivot table; an
overflowing row is split. A tile you leave out goes after the others, one
per row. Omit to leave the arrangement alone; [] resets it, one tile per
row.
Example
Add a report’s pivot table to an existing dashboard and put it on the first row, next to a tile already on the page:665f1c2e8a4b3d0012a7ed20 is the visualization_id of a tile already on the
dashboard, as get_dashboard lists
it. Every tile left out of layout_rows goes after the others, one per row.
Response
Body
Body
object
The dashboard as it now stands after the update.
object[]
What became of each report you passed, one row per tile: a report added as
both a chart and a pivot table gets a row for each, so does each type you
asked for that the report lacks, and one not found or with no tile at all
gets a single row, with visualization_type null. Read
outcome on each
before reporting success, since a call can succeed having added nothing you
asked for. Empty when no reports were passed.object[]
The dashboard’s rows as they now stand, top to bottom, each tile left to
right — read back from the dashboard, so it shows where every tile actually
sits. A tile this call added lands on a row of its own at the end. Empty
when the dashboard has no tile yet. Rows passed in layout_rows are applied
after the reports are added and come back as the store took them: a row
holds at most three charts or two pivot tables and is split when it
overflows, and a tile you left out keeps its place on a row of its own.
object[]
One row per layout entry you passed, saying what became of it. Empty when no
layout_rows were passed.