---
title: "Save a chart, table or dataset (Pro)"
method: POST
path: "/api/v1/workspace"
---

# Save a chart, table or dataset (Pro)

`POST /api/v1/workspace`

## Request

- Base URL: `https://invokely.ai`
- URL: `https://invokely.ai/api/v1/workspace`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`
  - none

Save a chart, a table or a dataset to the user's private workspace. Needs the Pro plan; on other plans it returns PLAN_REQUIRED. Use it when the user asks to keep, save or store a chart, table or data.
Chart or table of an indicator for up to 10 places, read live every time it is opened: {"kind": "chart", "title": "Unemployment, Texas vs California", "indicator": "unemployment_rate", "places": ["Texas", "California"], "from": "2015"}.
Dataset of the user's own rows (up to 20,000 rows and 30 columns; an MCP request carries at most 256 KB, so send larger tables through the dashboard upload): {"kind": "dataset", "title": "Store sales 2025", "columns": ["month", "sales"], "rows": [["2025-01", 1200], ["2025-02", 1350]]}.
Every row must have one value per column and column names must be unique; otherwise the call fails with INVALID_ARGUMENT naming the row.
Returns {id, kind, title, size_bytes, created_at, updated_at, warnings?}. warnings names places that have no data yet and repeated titles; tell the user. The user can open it at https://invokely.ai/dashboard/workspace. To change an item later, use workspace_update, which keeps the id.

## Request body

- object
  - `kind` 'chart' | 'table' | 'dataset', required: chart or table (a saved view of an indicator) or dataset (rows you provide).
  - `title` string, required
  - `indicator` string: chart and table only. Indicator id from search_indicators, for example "population", "registered_unemployment_rate", "unemployment_rate", "cpi_annual_change", "net_income_per_person".
  - `places` string[]: chart and table only. Place names or ids.
  - `from` string: chart and table only. Optional first period.
  - `to` string: chart and table only. Optional last period.
  - `frequency` 'year' | 'half' | 'quarter' | 'month': Optional. Force a frequency when the indicator exists in several (for example monthly and annual unemployment).
  - `description` string: dataset only. Optional note on what the data is.
  - `columns` string[]: dataset only. Column names.
  - `rows` array[]: dataset only. One array per row, in column order.
    - union[]
      - union
        - string
        - number

## Response `201`

The saved item: {id, kind, title, size_bytes, created_at, updated_at}.

- Data
  - `data` unknown, required

## Other responses

- `400`: Invalid argument (INVALID_ARGUMENT).
- `401`: API key required (UNAUTHORIZED).
- `402`: The workspace is part of the Pro plan (PLAN_REQUIRED).
- `409`: Workspace limit reached (LIMIT_REACHED).
- `413`: Body over 1 MB.

---

[API](https://skmtc.dev/invokely/apis/invokely-statistics-api.md) · [All operations](https://skmtc.dev/invokely/apis/invokely-statistics-api/llms.txt) · [OpenAPI document](https://skmtc.dev/invokely/apis/invokely-statistics-api/revisions/3b0f775bccb6?raw)
