# Workspaces and organizations

> Choose the workspace Nodaro CLI commands act in, create organizations, invite a class or a team in bulk, and export usage reports as tables, JSON or CSV.

Source: https://nodaro.ai/docs/developers/cli/workspaces

**Workspaces** are where work lives on an instance with organizations: a class in a school, a team in a company. These Nodaro CLI commands choose the workspace your commands act in, manage organizations and their members, and export usage reports. Organizations are a Nodaro Cloud feature that is switched on per instance; on an instance without them, these commands are not available.

## Choose the workspace a command acts in

A browser shows the current workspace on every screen. A terminal shows nothing, so the CLI makes the choice explicit. There are three ways to set it, and each one beats the one below it:

```bash
nodaro --workspace <id> workflows list   # 1. this command only
export NODARO_WORKSPACE=<id>             # 2. this shell, or this CI job
nodaro workspace use <id>                # 3. saved on the profile until you change it
```

- `nodaro workspace current` tells you where you are, and which of the three decided. An inherited `NODARO_WORKSPACE` would otherwise look exactly like a saved workspace.
- `nodaro workspace use` checks the workspace before it saves it, so a typo fails once, there, and not on every later command.
- `nodaro workspace clear` removes the saved workspace.
- With no workspace set, everything happens in your personal space.

The workspace decides which workspace a **list** reads from and where a **create** lands. It never decides access: reading, updating, deleting or running something you name by id follows that item's own workspace. So a forgotten `--workspace` cannot hide your work, and a wrong one cannot reach anyone else's.

## Workspace commands

```bash
nodaro workspace list [--json]
nodaro workspace current [--json]
nodaro workspace use <id> [--json]
nodaro workspace clear
nodaro workspace get <id> [--json]
nodaro workspace members <id> [--limit <n>] [--cursor <token>] [--json]
nodaro workspace join <code> [--json]
nodaro workspace usage [id] [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--tz <iana>] [--group-by member|model|day|none] [--user <id>] [--limit <n>] [--cursor <token>] [--csv] [--json]
```

`workspace join` takes the eight-character join code a workspace admin shares. A join code makes you a plain member of one workspace.

## Organization commands

```bash
nodaro org list [--json]
nodaro org get <id> [--json]
nodaro org create --name <name> --kind school|team [--slug <slug>] [--accept-terms] [--json]
nodaro org members <orgId> [--limit <n>] [--cursor <token>] [--json]
nodaro org invite <orgId> --email a@x.com --email b@x.com [--role admin|member] [--workspace <id>] [--workspace-role admin|member] [--json]
nodaro org invitations <orgId> [--status open|accepted|revoked|expired] [--limit <n>] [--cursor <token>] [--json]
nodaro org revoke <invitationId> [--json]
nodaro org audit <orgId> [--limit <n>] [--cursor <token>] [--json]
nodaro org usage <orgId> [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--tz <iana>] [--group-by workspace|member|model|day|none] [--workspace <id>] [--user <id>] [--limit <n>] [--cursor <token>] [--csv] [--json]
```

- `org create --kind school` needs `--accept-terms`: the owner states that they have the authority to enrol students.
- A new organization usually starts as pending, and becomes active once the platform approves it. Until then, nothing in it can change.
- `org revoke` cancels an invitation, and its link stops working.
- `org audit` lists the organization's audit log.

## Invite people

Bringing a class or a team onto an instance is a bulk, one-off job, and `nodaro org invite` is built for it. Repeat `--email` once per person, and optionally place everyone in a workspace:

```bash
nodaro org invite org_abc --email ada@school.edu --email grace@school.edu --workspace ws_xyz --workspace-role member
```

The command prints one line per address, saying whether the address was emailed. An install without a mail provider cannot email anybody. Its rows say `not emailed (link_only)` and carry the invitation link on the next line.

Send those links yourself. Otherwise the invitation exists and nobody can reach it. An invitation expires after 14 days.

## Usage reports

`nodaro org usage` and `nodaro workspace usage` answer who spent how many credits on what, over a date range.

- `--from` and `--to` are inclusive dates, written `YYYY-MM-DD`. `--tz` sets the time zone of the day buckets; the default is your terminal's zone.
- `--group-by` groups the report by `workspace` (organization reports only), `member`, `model` or `day`. `none` lists the individual runs, newest first.
- The default output is a table with a totals line. `--json` prints the full report, and `--csv` writes the CSV to standard output, ready to redirect to a file.

```bash
nodaro org usage org_abc --from 2026-09-01 --to 2026-09-30 --group-by member --csv > september.csv
```

A plain workspace member sees only their own usage. Workspace admins see everyone in the workspace, and organization reports are for the owner and the organization admins.

## Frequently asked questions

### How do I make the Nodaro CLI work in a workspace?

Use --workspace with an id for one command, set NODARO_WORKSPACE for a shell or a CI job, or save a workspace on the profile with nodaro workspace use. The flag beats the variable, and the variable beats the saved workspace.

### Can a wrong workspace id expose someone else's work?

No. The workspace decides where lists read from and where new work lands. Access to anything you name by id is decided by that item's own workspace, so a wrong workspace only wastes a command.

### Why did nodaro org invite print a link instead of sending an email?

The install has no mail provider, or the delivery failed. The invitation exists, but nobody can reach it until you send that link to the person yourself.

### How do I export a month of usage as CSV?

Run nodaro org usage with the organization id, --from and --to dates, a --group-by value such as member, and --csv, then redirect the output to a file.
