---
title: "The Grid82 CLI"
description: "A command for every API operation, JSON output for scripts, exit codes by kind of failure. On npm as grid82."
canonical: "https://grid82.com/docs/cli/overview"
updated: "2026-11-13"
---

# The Grid82 CLI

## Install

Node.js 22.12 or later. Run it without installing, or install it once:

```bash
npx grid82 --version
npm install -g grid82
```

The binary is `grid82`.

## Commands

Every operation of both APIs is a command, named after it: `records.list` is
`grid82 records list`. Path parameters come first, in order; everything else is a flag, or
`--body` with the whole request as JSON. A new endpoint is a new command the day it ships, with
its help text already correct.

```bash
grid82 records list tbl_8fj3kq2wmv5d --view-id viw_e4ks9mz2bh7w
grid82 records get tbl_8fj3kq2wmv5d rec_4nqw8e2hzk7s
grid82 records create tbl_8fj3kq2wmv5d --records '[{"Name":"New record","Amount":1000}]'
grid82 files upload tbl_8fj3kq2wmv5d --file ./contract.pdf --record-id rec_4nqw8e2hzk7s
grid82 rules simulate app_5mg8rw2kx4tn --roles rol_v6nh3ta8rk2e --table-id tbl_8fj3kq2wmv5d --op read
```

Each page of the [App API](/docs/app-api/records/list) and
[Builder API](/docs/builder-api/apps/list) references names its command.

## Signing in

Three ways, one per situation:

```bash
grid82 auth login                                            # the Studio, in your browser
grid82 auth login --target https://your-suite.grid82.app/your-app   # one app
grid82 auth login --device                                   # a machine with no browser
```

In CI, skip the login: set `GRID82_TOKEN` to one of your keys and `GRID82_URL` to the Studio or
the app it is for. On a desktop, tokens are kept in the system keychain.

## Made for scripts and agents

- **Output is JSON whenever it is not going to a terminal**, so nobody has to remember `--json`.
- Cursor-paginated JSON commands return `{ data, meta }`. Pass `meta.nextCursor` as `--cursor`
  until `meta.hasMore` is false. Table output shows the next cursor; NDJSON outputs rows only.
- **The exit code says what kind of failure it was**: 2 usage, 3 authentication, 4 not found,
  5 rate limited, 6 conflict, 7 plan. The API's error envelope goes to stderr.
- **A document comes from a file**: `--source @relance.ts` sends a workflow's code from disk and
  `--body @body.json` a whole request body (`@-` reads stdin).
- **Deleting asks for the name**, as the Studio does:
  `grid82 tables delete app_5mg8rw2kx4tn tbl_x2c7nw4hq9fk --confirm "Old deals"`.
- `grid82 mcp` bridges a local stdio client to the MCP server, and `grid82 doctor` checks the
  connection, the credential, the version and the clock.

## More than MCP, by design

Uploading files is possible from the CLI and not from MCP, because a terminal can send bytes and
a model cannot. Everything else is at parity by construction.
