Command line

Install the Jsonify CLI, sign in with a workspace key, and run pipelines, watch runs, export datasets and ask Jason for work from a terminal or a job.

The Jsonify CLI is a single command, jsonify, that talks to one workspace over HTTPS with a key you create in Jsonify. It is built for people at a terminal and for automation and AI agents alike: every command prints one JSON object, errors go to stderr as JSON, and exit codes are stable.

Platform
macOS (Windows is coming soon)
Needs
Nothing to install first; the installer checks your Mac
Access
Read, or Operator
Output
JSON; JSON Lines for watch commands

Create a key

A CLI key is an integration. Each key belongs to one workspace and has one access level, and you can have as many as you need.

  1. Add integration and choose Jsonify CLI under Developer. The dialog is titled Connect Jsonify CLI.
  2. Label it. Name the person or agent that will use it, for example “Acme data agent”. Use separate integrations when people or agents need separate keys.
  3. Choose the access. Read or Operator, described below.
  4. Create key. The next screen, Jsonify CLI is ready, shows the key once, followed by the three commands to install, sign in and verify.
  5. Copy the key now. Jsonify does not show it again. If it is lost, rotate the credential from the integration’s detail page.
The Connect Jsonify CLI dialog with the Label field and the Read and Operator access cards
Choose the access level before creating the key. It can be changed later by rotating.
Option Values Default What it does
Label Text “Jsonify CLI” How the integration appears on the Integrations page, and the name shown as the author of any chat this key starts
Access Read / Operator Read What the key may do

Read or Operator

Access What the key can do
Read Inspect workspace context, pipelines, versions and runs; search; read usage; read, query and export dataset rows; read Jason chats and their events
Operator Everything in Read, plus start and cancel runs, rerun rows, change schedules, fetch caching and automatic repair, and start, message, stop or archive Jason chats

No key can edit, approve or activate a pipeline version directly. Changes go through Jason’s normal build, review and activation, which an Operator key can request and follow.

Give a key the least access that does the job. A reporting job needs Read; an agent that runs pipelines needs Operator. Keys never expire on their own; they stop working when rotated, revoked, when the integration is deleted, or when the person who created them leaves the organisation.

Install

Run the installer shown on the setup screen:

curl -fsSL https://factory.jsonify.com/cli/install.sh | sh

It verifies the download’s checksum and installs ~/.local/bin/jsonify. It does not use sudo and does not edit your shell profile; if ~/.local/bin is not on your PATH, it prints the line to add. Then:

jsonify --version

The CLI keeps itself current: when a newer release is available it updates itself once in the background, and jsonify --update checks and updates on demand.

Sign in

Use the second command from the setup screen. --profile names this workspace on your machine; use the workspace’s name or slug.

jsonify auth login --profile acme --api-url https://factory.jsonify.com

It asks for the key and does not echo it. To supply the key from automation without putting it in shell history:

printf '%s' "$JSONIFY_KEY" | jsonify auth login --profile acme --api-url https://factory.jsonify.com --stdin

Confirm the workspace and access level:

jsonify context

Profiles

One profile per workspace. The profile you signed in with last is the default.

Command What it does
jsonify auth list Lists profiles and marks the default
jsonify auth default --profile NAME Makes a profile the default
jsonify auth status --profile NAME Checks one profile’s key still works
jsonify auth logout --profile NAME Removes a profile
jsonify --profile NAME <command> Uses a profile for one command

For a one-off job, environment variables override stored profiles and are never saved: JSONIFY_API_KEY and JSONIFY_API_URL.

Treat the key like a password. Do not pass it as a command argument, commit it, paste it into an agent’s instructions, or log it.

Output

  • One JSON object per command. In a terminal it is indented and coloured; when piped or redirected it is compact, one object, no colour. Force either with --pretty or --compact before the command; --color auto|always|never controls colour.
  • JSON Lines for watch commands. runs watch and jason watch print one compact object per line as things change, with a heartbeat about every thirty seconds, and stop when the run or turn finishes.
  • Errors on stderr as JSON, with a short error identifier, a message, the HTTP status and a request_id to quote to support.
  • Lists carry items, a next_cursor or next_before when there is another page, and truncated.
  • Stable identifiers and links. Every pipeline, run, dataset and chat comes with its public identifier and its Jsonify URL. Timestamps are Unix seconds with an ISO 8601 twin (created_at_iso).
Exit status Meaning
0 Success
2 Local usage, configuration or file problem
3 Sign-in or permission failure
4 Jsonify rejected the request
5 Network or server failure
6 A watched run failed or was cancelled

Command reference

Every command has --help with the exact options installed on your machine. This table is the map.

Workspace

Command What it does
jsonify context The workspace, access level, billing allowance and rows remaining
jsonify search "text" Finds pipelines, datasets, runs and chats by name. Add --dataset-rows to also search inside dataset values (three characters or more)
jsonify usage [--days N] [--pipeline ID] Rows used and remaining, and run activity for the period
jsonify ask "task" [--context pipeline:ID] [--attach FILE] [--notify EMAIL] [--wait] Sends Jason a task, optionally attached to a pipeline, dataset or workspace, and optionally waits for the reply. Operator

Pipelines

Command What it does
jsonify pipelines list [--limit N] Pipelines with status, version and schedule
jsonify pipelines get ID [--version N] [--full-inputs] One pipeline: what it collects, parameters, inputs, outputs
jsonify pipelines inspect ID The same plus the latest run, per-output counts and a failure summary
jsonify pipelines versions ID The version history with changelogs
jsonify pipelines run ID [--version N] [--row-limit N \| --uncapped] [--param k=v] [--input NAME=DATASET@VERSION/TABLE] [--idempotency-key KEY] [--wait] Starts a run. Operator
jsonify pipelines schedule ID hourly\|daily\|weekly\|off [--time HH:MM] [--day mon] [--timezone TZ] Sets the schedule. Operator
jsonify pipelines cache ID <duration\|off\|default> Sets how long fetched pages may be reused, for example 12h or 30d. Operator
jsonify pipelines auto-heal ID on\|off Turns automatic repair of failed scheduled and webhook runs on or off. Operator
jsonify pipelines build "brief" [--notify EMAIL] Asks Jason to build a new pipeline. Operator
jsonify pipelines change ID "request" [--notify EMAIL] [--wait] Asks Jason to change a pipeline; --wait follows it through review and activation. Operator

Pipeline identifiers accept the short identifier, the identifier with its slug, or the full Jsonify URL.

Runs

Command What it does
jsonify runs list [--status …] [--limit N] Recent runs, newest first
jsonify runs get RUN [--samples] [--source-breakdown] One run: status, timing, outputs and counts. --samples adds five rows per output
jsonify runs watch RUN Follows a run as JSON Lines until it finishes. Exit 6 on failure
jsonify runs failures RUN A summary of the failed and held rows and their reasons
jsonify runs activity RUN [--kind event\|log\|fetch\|provenance] [--limit N] The run’s activity feed
jsonify runs logs RUN [--source …] [--level …] [--cursor …] The run’s logs, filtered and paged
jsonify runs steps RUN Each step with its status and row counts
jsonify runs step-data RUN STEP [--offset] [--limit] [--column C] Rows a completed step produced
jsonify runs output RUN --output NAME [--offset] [--limit] A page of one published output
jsonify runs export RUN --output NAME --out FILE [--max-rows N] [--column C] Writes one output as JSON Lines; 10,000 rows by default
jsonify runs provenance RUN --row-id ID Where one row came from: step, fetch, source page
jsonify runs cost RUN What the run used
jsonify runs cache RUN How much the run reused from cache versus fetched live
jsonify runs lineage RUN The chat, candidate, review and version behind the run
jsonify runs cancel RUN Stops an active run. Operator
jsonify runs rerun-rows RUN --input-name N --output O --row-id ID… [--idempotency-key K] Re-collects up to 100 exact rows. Operator

Datasets

Command What it does
jsonify datasets list Datasets with row counts and versions
jsonify datasets get ID One dataset: worksheets, columns, versions
jsonify datasets rows ID [--version N] [--table T] [--offset] [--limit] [--column C] A page of rows from one version
jsonify datasets query --dataset ALIAS=ID[@VERSION][/TABLE]… --sql "…" [--max-rows N] Read-only SQL across up to 20 datasets, 500 rows
jsonify datasets export ID [--version N] [--table T] --format json\|csv\|xlsx --out FILE Writes one version to a file. A workbook always holds every worksheet

Deliverables

Command What it does
jsonify deliverables list Files a pipeline produced, latest version of each
jsonify deliverables history ID Every version of one file
jsonify deliverables fetch VERSION_ID --out FILE Downloads one exact version
jsonify deliverables delete ID Removes the series. Operator

Jason

Command What it does
jsonify jason list Chats in the workspace
jsonify jason new "text" [--attach FILE] [--notify EMAIL] Starts a chat. Operator
jsonify jason get SESSION A chat’s state
jsonify jason events SESSION [--after N] What has happened in a chat, from an event number
jsonify jason send SESSION "text" [--notify EMAIL] Sends a message to a chat. Operator
jsonify jason watch SESSION [--after N] Follows a chat as JSON Lines. --after 0 replays from the start
jsonify jason stop SESSION Stops the running turn. Operator
jsonify jason archive SESSION Archives the chat. Operator

--notify EMAIL on any command that starts a Jason turn sends one email when that turn finishes; Jsonify creates the email channel for you. Chats started from the CLI appear in the workspace’s chat history with a green CLI badge and the integration’s label as the author.

Global options

--version, --guide (the built-in agent guide, offline), --docs (the full reference from your Jsonify origin), --update, --pretty, --compact, --color, --profile NAME. Put them before the command.

Typical flows

Run a pipeline and wait

jsonify pipelines run marketpipe03 --row-limit 500 --param region=uk --idempotency-key nightly-2026-09-15 --wait

--wait follows the run and exits 0 when it completes or 6 when it fails, so a job can branch on it. The idempotency key makes retries safe: repeating the same command with the same key returns the same run instead of starting another. --param values that are valid JSON keep their type (true, 12, "pt").

Watch a run started elsewhere

jsonify runs watch mrun00000361

One compact JSON line each time the run’s state or evidence changes, a heartbeat line about every thirty seconds, then exit. Reconnects after a dropped connection do not repeat lines you already have.

Export a dataset

jsonify datasets export marketdata02 --format csv --table main --out ./price-observations.csv
jsonify datasets export marketdata02 --version 61 --format xlsx --out ./price-observations-v61.xlsx

Exports are rendered on the server and downloaded whole; the CLI refuses to overwrite an existing file unless you add --force. To export the rows a particular run produced, before or after it publishes, use runs export.

Ask a question of the data

jsonify datasets query \
  --dataset offers=marketdata01 \
  --dataset obs=marketdata02@61 \
  --sql 'SELECT o.retailer, count(*) AS drops FROM obs JOIN offers o ON o.product_url = obs.product_url WHERE obs.change < 0 GROUP BY o.retailer ORDER BY drops DESC' \
  --max-rows 50

Ask Jason and wait for the answer

jsonify ask "Why did last night's price promotion run publish 30% fewer rows than usual?" \
  --context pipeline:marketpipe03 --wait
jsonify pipelines change marketpipe03 "Add the promotion end date as its own column" --notify you@example.com --wait

The second command follows the change through Jason’s build, the reviewer’s verdict and activation, and finishes with the new version number.

Rotate or revoke a key

Open the CLI integration from the Integrations page. Its Settings tab shows the credential: its identifier, access, who created it, when it was created, rotated and last used.

  • Rotate key issues a new key, shown once, and stops the old one immediately. Choose the access the new key should have in Access after rotation first; this is how you move a key from Read to Operator or back. Then run jsonify auth login again on each machine that uses it.
  • Revoke stops the key immediately and turns the integration Revoked. The button becomes Issue new key, which is a rotation that brings it back to Live.
  • Delete integration (on the Danger tab) revokes the key too.
The CLI credential panel with the install commands, credential facts, the Access after rotation menu and the Rotate key and Revoke buttons
Rotation and revocation both take effect immediately.

Pointing an AI agent at the CLI

The CLI ships with an operating guide written for agents. It explains the output contract, the exit codes, how to wait for a run or a chat without polling, how to retry safely, and what the CLI deliberately will not do. Have the agent read it before it runs anything else:

jsonify --guide

The same text is on the integration’s Overview tab as Guide for AI agents, with Copy guide so you can paste it into the instructions file of the project the agent works in, and Full reference for the complete command reference. Give the agent its own key with its own label; every chat it starts is then attributed to it in the chat history, and revoking it never affects a person’s key.

An agent given an Operator key and the guide can carry a whole change on its own: ask Jason for the change with pipelines change --wait, run the activated version with pipelines run --wait, and export the result with runs export. Every step is a normal Jsonify action you can see in the browser.

Troubleshooting

Symptom What to do
jsonify: command not found Add ~/.local/bin to PATH as the installer said, then open a new shell
The installer says the runtime on the Mac is too old Update macOS (or its developer tools) and run the installer again
“Credential permissions are rejected” The CLI refuses a loosely permissioned credentials folder. Restore 0700 on ~/.config/jsonify and 0600 on the file inside it, with no symlinks
“The key is invalid or revoked” (exit 3) Check the integration in Jsonify. Rotate if the key was lost, then jsonify auth login again
A command needs Operator access Rotate the integration to Operator, or create a separate Operator integration
The installer says “Windows is coming soon.” The first release is macOS only

Every request carries a request_id; include it from the error JSON when you contact support.

What’s next

Connect your data assistant

Build datasets and work with your data in ChatGPT, Claude, Copilot or another assistant.

Connect in ChatGPT

  1. Open Settings → Security and login and enable Developer mode.
  2. Open Plugins and select + to create a connection. Name it Jsonify, add a short description, and paste the URL below.
  3. Use OAuth for authentication, select Create, and sign in to your Jsonify account when prompted.
  4. Start a new chat and select Jsonify from + → More, then describe your dataset.
Server URLhttps://factory.jsonify.com/mcp

If Developer mode is unavailable, your plan or workspace settings may restrict custom connections.

Official ChatGPT setup guide ↗

Then say: “build me a dataset of competitor product prices and availability, refreshed daily”. Full instructions per client on /connect.