Agentic Table¶
Experimental
The CLI is experimental and its interface may change in future releases.
Work with Agentic Table (magic table) sheets through the public magic-table API. The read commands (get-sheet, get-cell, cell-history, list-exports) are Tier 0: they never write and never require confirmation. The write commands (create-sheet, import, export) drive the full loop — create a sheet, populate it, run the agent, and export the answers. Every call is scoped to the configured user/company; sheet-role access (Owner / Can manage / Can edit) is enforced on the server, and a denial is reported as agentic-table: permission denied.
agentic-table get-sheet¶
Show a sheet summary: name, state, and row count. Add --metadata for sheet-level metadata entries and --cells to include cell values.
Synopsis:
agentic-table get-sheet <table_id> [--cells] [--metadata] [--json]
Arguments:
| Argument | Description |
|---|---|
table_id |
The magic-table sheet id |
Options:
| Option | Description | Default |
|---|---|---|
--cells |
Include cell values in the output | off |
--metadata |
Include sheet-level metadata entries | off |
--json |
Print the raw sheet JSON | off |
Example:
unique-cli agentic-table get-sheet mt_abc123 --metadata
Sheet: Due Diligence Q1
ID: mt_abc123
State: IDLE
Rows: 3
Created by: user_abc
Created: 2026-01-01 00:00
Metadata:
region: EU
agentic-table get-cell¶
Show a single cell by its row and column order.
Synopsis:
agentic-table get-cell <table_id> --row <N> --col <N> [--json]
Options:
| Option | Description |
|---|---|
--row |
Row order (0-based, required) |
--col |
Column order (0-based, required) |
--json |
Print the raw cell JSON |
Example:
unique-cli agentic-table get-cell mt_abc123 --row 1 --col 2
Sheet: mt_abc123
Row: 1
Column: 2
Locked: no
Text:
The management fee is 2%.
agentic-table cell-history¶
Show a single cell's log/edit history: each entry's timestamp, actor, source message id, and the logged text recorded by prior edits.
Synopsis:
agentic-table cell-history <table_id> --row <N> --col <N> [--json]
Options:
| Option | Description |
|---|---|
--row |
Row order (0-based, required) |
--col |
Column order (0-based, required) |
--json |
Print the raw log entries as JSON |
Example:
unique-cli agentic-table cell-history mt_abc123 --row 1 --col 2
Cell history (row 1, col 2) — 1 entry
- 2026-01-02 09:30 ASSISTANT [msg_9]
Answered from source [source1]
agentic-table list-exports¶
List a sheet's export artifacts (full report, question export, agentic report). CONTENT is populated once an artifact reaches the DONE state; pending artifacts show -.
Synopsis:
agentic-table list-exports <table_id> [--json]
Options:
| Option | Description |
|---|---|
--json |
Print the raw artifact list as JSON |
Example:
unique-cli agentic-table list-exports mt_abc123
2 export artifact(s):
TYPE STATE ID CONTENT UPDATED
FULL_REPORT DONE artifact_1 cont_export 2026-01-01 00:01
QUESTIONS IN_PROGRESS artifact_2 - 2026-01-01 00:00
agentic-table create-sheet¶
Create a new, empty sheet in a space. The printed ID is the table_id used by every other command.
Synopsis:
agentic-table create-sheet <assistant_id> [--name <name>] [--due-at <iso8601>] [--json]
Arguments:
| Argument | Description |
|---|---|
assistant_id |
The space (assistant) the sheet is created in; you must have write access |
Options:
| Option | Description |
|---|---|
--name |
Sheet name |
--due-at |
Due date (ISO-8601, e.g. 2026-12-31T00:00:00Z) |
--json |
Print the raw sheet JSON |
Example:
unique-cli agentic-table create-sheet asst_123 --name "Vendor DDQ"
Sheet: Vendor DDQ
ID: mt_abc123
Due diligence ID: dd_1
State: IDLE
Created by: user_abc
Created: 2026-01-01 00:00
agentic-table import¶
Import questions and/or source files into a sheet. Adding new questions (file ids or texts) triggers the agent run; adding only sources does not. Ids/texts already on the sheet are skipped. The call is rejected while the sheet is already processing.
With --wait, the command blocks until the triggered run finishes (or --timeout elapses) so you can chain an export.
A run leaves no durable record of itself, so the wait has to catch the sheet in PROCESSING. A very short run can pass through between two polls; polling is dense over the opening seconds to narrow that window, but it cannot close it — that needs a per-run signal the public API does not expose yet (UN-23683). Transient read failures during the wait are retried, since the import itself has already been accepted by then.
What happens when no run is observed depends on what you submitted. A sources-only import never starts one, so that is reported as a note and the command succeeds. If you submitted questions, a run was expected — not seeing one within 120s is treated as an error, because the pickup may simply be late and exiting 0 would let a && chain export a sheet that is still being answered. The outcome is then unknown rather than failed: poll get-sheet until the state settles on IDLE and the imported rows carry answers, and export only after that. Exporting straight away would report unanswered rows as the result. Re-importing is not the answer either — questions the sheet already has produce the same error: also a no-op, but not one the command can tell apart from a late pickup.
Synopsis:
agentic-table import <table_id> [--question-file-id <id>]... [--question-text <text>]...
[--source-file-id <id>]... [--context <text>]
[--wait] [--timeout <seconds>] [--start-timeout <seconds>] [--json]
Options:
| Option | Description | Default |
|---|---|---|
--question-file-id |
Content id of a questionnaire file (repeatable) | |
--question-text |
A question to add directly (repeatable) | |
--source-file-id |
Content id of a source/knowledge file (repeatable) | |
--context |
Free-text context for the run | |
--wait |
Wait for the triggered run to finish | off |
--timeout |
Max seconds to wait when --wait is set |
600 |
--start-timeout |
Max seconds to wait for the run to be picked up, before treating it as never started. Counts against --timeout. Raise it when the worker queue is slow |
120 |
--json |
Print raw JSON. --wait adds runStarted and finalState alongside result |
off |
Example:
unique-cli agentic-table import mt_abc123 --question-file-id c_q --source-file-id c_src --wait
Action: import
Result: OK
Detail: accepted
Run finished (state: IDLE).
agentic-table rerun-row¶
Re-run the agent for a single row. This is the only way to redo one answer: import is delta-based and skips questions the sheet already has, so it will not re-answer an existing row.
<row_order> is the same number get-cell --row takes: row 0 is the header, so answerable rows start at 1. get-cell --row 4 and rerun-row <table_id> 4 address the same row — there is no offset between the two commands. Values below 1 are rejected by the CLI before the request is made, since a rerun is an audited write and there is no point spending an audit entry on input that cannot be valid.
The backend declines a row that is locked or in a final review status — a person has settled that answer — and also declines any rerun while the sheet is already processing, which is transient and clears once the current run finishes.
Like the whole-sheet run, a rerun is asynchronous. With --wait, the command polls until the sheet leaves PROCESSING. Unlike import, a rerun always triggers a run, so there is no benign "nothing started" case — not observing one within the start window is an error.
Two limits worth knowing. A rerun is the fastest operation in the system, so it can finish between two polls and be reported as never observed; the error text says so, and cell-history on the row settles it. And the wait watches sheet state, so on a shared sheet it cannot tell your rerun from a run someone else started. Both need a row-level signal the API does not expose yet (UN-23683).
To redo several rows, run them one at a time with --wait: the sheet accepts one run at a time, so a second rerun-row issued before the first finishes is declined. There is no batch form.
Synopsis:
agentic-table rerun-row <table_id> <row_order> [--wait] [--timeout <seconds>] [--start-timeout <seconds>] [--json]
Options:
| Option | Description | Default |
|---|---|---|
--wait |
Wait for the triggered rerun to finish | off |
--timeout |
Max seconds to wait when --wait is set |
600 |
--start-timeout |
Max seconds to wait for the rerun to be picked up, before treating it as never started. Counts against --timeout |
120 |
--json |
Print raw JSON. --wait adds rowOrder and finalState alongside result |
off |
Example:
unique-cli agentic-table rerun-row mt_abc123 4 --wait
Action: rerun
Result: OK
Detail: accepted
Row 4 rerun finished (state: IDLE).
agentic-table export¶
Generate export artifacts (FULL_REPORT, QUESTIONS, AGENTIC_REPORT). Generation is asynchronous. With --wait, the command polls until each requested type is DONE and prints the artifact table with the contentId to download; an artifact entering ERROR fails fast.
Synopsis:
agentic-table export <table_id> --type <TYPE>... [--wait] [--timeout <seconds>] [--json]
Options:
| Option | Description | Default |
|---|---|---|
--type |
Artifact type: FULL_REPORT, QUESTIONS, or AGENTIC_REPORT (repeatable, required) |
|
--wait |
Wait for the requested artifacts to be ready, then list them | off |
--timeout |
Max seconds to wait when --wait is set |
600 |
--json |
Print raw JSON. --wait adds artifacts alongside result |
off |
Example:
unique-cli agentic-table export mt_abc123 --type FULL_REPORT --wait
Action: export
Result: OK
1 export artifact(s):
TYPE STATE ID CONTENT UPDATED
FULL_REPORT DONE artifact_1 cont_export 2026-01-01 00:01
Full-loop recipe¶
Create a sheet, populate and run it, then export the answers. Every step exits non-zero on failure — including a rejection the backend reports in the response body rather than as an HTTP error — so the steps can be chained with &&:
SHEET_JSON=$(unique-cli agentic-table create-sheet asst_123 --name "Vendor DDQ" --json) && \
SHEET=$(printf '%s' "$SHEET_JSON" | jq -r .sheetId) && \
unique-cli agentic-table import "$SHEET" --question-file-id c_questions --source-file-id c_sources --wait && \
unique-cli agentic-table export "$SHEET" --type FULL_REPORT --wait && \
unique-cli agentic-table get-sheet "$SHEET" --cells
Capture the JSON and parse it in two steps rather than piping create-sheet straight into jq. A shell assignment takes the exit status of the last command in the pipeline, so SHEET=$(unique-cli ... | jq ...) reports jq's status and discards the CLI's. Errors go to stderr, so jq would read empty input, print nothing and succeed — leaving $SHEET empty and the && chain running on against a sheet that was never created. Splitting the assignment puts the CLI's own exit status back in the chain. set -o pipefail also works if the recipe runs inside a script you control.
Read the produced answers with get-sheet --cells / get-cell and download an export via the Content API using the contentId shown by export / list-exports.