The numbers of a saved widget
const url = 'https://beta-api.plune.ai/v1/widgets/example/data?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://beta-api.plune.ai/v1/widgets/example/data?from=2026-04-15T12%3A00%3A00Z&to=2026-04-15T12%3A00%3A00Z' \ --header 'Authorization: Bearer <token>'The widget’s recipe asked of the data for a period: one shared time axis for every block, series capped at 50 (a table at 500 rows) with truncated and the codes in notMeasured, groups past 20 folded into «Other», a denominator on every block. The cost is checked before any query (400 widget_too_expensive); a block that runs out of time (5 s) is reported as block_timeout and the others are answered. A recipe that no longer matches the catalogue is a 422 config_stale.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Query Parameters
Section titled “Query Parameters ”Responses
Section titled “ Responses ”The numbers
The numbers of a widget. Every block shares one time axis; every block carries its denominator.
object
The start of each bucket, as a calendar date in the reader’s zone; at most 366.
At most 50 (blocks x groups x segment values), the biggest first when cut; empty for a table.
object
null: no value of the grouped property, or no Group by.
Over the whole period: what a donut slice or a table row shows.
object
A table’s rows, at most 500.
object
A6: per block, how many objects of the entity the project has in the period BEFORE the filters (denominator) and after them (matched). null for a block that ran out of time.
object
Series or rows were dropped to hold the caps.
What could not be measured or shown whole, as codes: truncated_series, truncated_rows, folded_groups, block_timeout.
object
object
Example
{ "render": "line", "bucket": "day", "from": "2026-10-01T00:00:00.000Z", "to": "2026-10-03T23:59:59.000Z", "axis": [ "2026-10-01", "2026-10-02", "2026-10-03" ], "series": [ { "block": 0, "entity": "run", "group": null, "segment": "nightly", "total": 2, "points": [ { "t": "2026-10-01", "v": 1 }, { "t": "2026-10-02", "v": 1 }, { "t": "2026-10-03", "v": 0 } ] }, { "block": 1, "entity": "run_result", "group": null, "segment": "nightly", "total": 3, "points": [ { "t": "2026-10-01", "v": 0 }, { "t": "2026-10-02", "v": 3 }, { "t": "2026-10-03", "v": 0 } ] } ], "denominators": [ { "block": 0, "entity": "run", "denominator": 5, "matched": 2 }, { "block": 1, "entity": "run_result", "denominator": 120, "matched": 3 } ], "truncated": false, "notMeasured": []}A missing or malformed window, a window over 366 points, or over the cost budget
object
Example generated
{ "error": "example"}No / invalid token or session
No such widget in the project
object
Example generated
{ "error": "example"}The stored recipe no longer matches the catalogue
object
Example generated
{ "error": "example"}Rate-limited: the per-route throttle, or the per-minute request limit of the plan an API token counts by (#1442; the body names the plan, #2092). Retry-After carries the seconds until the window rolls over.
object
Example generated
{ "error": "example"}Headers
Section titled “Headers ”Seconds until the window rolls over