# Projects Commands

> See [Projects module docs](../../modules/projects) for permissions and data model.

# Projects Commands

See [Projects module docs](../../modules/projects) for permissions and data model.

### `soat list-projects`

List projects

- Method: `GET`
- Path: `/api/v1/projects`

#### Usage

```bash
soat list-projects
```

#### Options

##### `--limit`

Maximum number of results to return

- Source: `query`
- Required: no
- Type: `integer`
- Default: `50`

##### `--offset`

Number of results to skip

- Source: `query`
- Required: no
- Type: `integer`
- Default: `0`

### `soat create-project`

Create a project

- Method: `POST`
- Path: `/api/v1/projects`

#### Usage

```bash
soat create-project --name <string>
```

#### Options

##### `--name`

—

- Source: `body`
- Required: yes
- Type: `string`
- Example: `My Project`

### `soat get-project`

Get a project

- Method: `GET`
- Path: `/api/v1/projects/{project_id}`

#### Usage

```bash
soat get-project --project-id <string>
```

#### Options

##### `--project-id`

Project public ID (proj_ prefix)

- Source: `path`
- Required: yes
- Type: `string`
- Example: `proj_V1StGXR8Z5jdHi6B`

### `soat update-project`

Update a project

- Method: `PATCH`
- Path: `/api/v1/projects/{project_id}`

#### Usage

```bash
soat update-project --project-id <string>
```

#### Options

##### `--project-id`

Project public ID (proj_ prefix)

- Source: `path`
- Required: yes
- Type: `string`
- Example: `proj_V1StGXR8Z5jdHi6B`

##### `--name`

—

- Source: `body`
- Required: no
- Type: `string`
- Example: `Renamed Project`

##### `--guardrail-ids`

Guardrails attached at the project scope.

- Source: `body`
- Required: no
- Type: `array<string>`

##### `--max-concurrent-runs`

Maximum orchestration runs of this project driven at once. `null` clears the limit (unlimited); otherwise an integer >= 1. Enforced at queue claim time — excess runs stay queued until a slot frees.

- Source: `body`
- Required: no
- Type: `integer \| null`
- Example: `5`

##### `--max-chain-generations`

Generations one continuation chain in this project may hold before the platform stops resuming it. `null` clears the project's ceiling, leaving the deployment-wide `MAX_CONTINUATION_CHAIN_GENERATIONS`; otherwise an integer >= 1. The effective budget is the smallest of the deployment's ceiling, this one, and the agent's own `max_chain_generations` stop condition, so an agent author can be stricter than this number but never exceed it.

- Source: `body`
- Required: no
- Type: `integer \| null`
- Example: `25`

##### `--max-run-depth`

`loop` / `sub_orchestration` nesting levels a run tree in this project may reach before the engine refuses to start the next child. `null` clears the project's bound, leaving the deployment-wide `MAX_ORCHESTRATION_RUN_DEPTH` (default 10); otherwise an integer >= 1. The effective bound is the smaller of the two, so this can only be stricter than the deployment's — which is what makes it a bound a graph author cannot opt out of. A refused child fails its parent run with `ORCHESTRATION_RUN_DEPTH_LIMIT`.

- Source: `body`
- Required: no
- Type: `integer \| null`
- Example: `5`

##### `--default-model-route-id`

Model route inherited by consumers in this project that bind neither `model_route_id` nor `ai_provider_id`. The route must belong to this project (`400` otherwise). `null` clears the default, which is refused with `409` while any consumer inherits it — repointing it to another route is always allowed and immediately changes which targets those consumers use.

- Source: `body`
- Required: no
- Type: `string \| null`
- Example: `route_V1StGXR8Z5jdHi6B`

##### `--audit-reads-enabled`

Opt the project into read auditing. When true, `GET` requests that name this project are recorded in the audit log alongside mutations. Defaults to `false`.

- Source: `body`
- Required: no
- Type: `boolean`
- Example: `true`

##### `--trace-content-retention-days`

How long trace and generation content is kept before the daily retention sweep content-purges it. `null` (the default) disables retention; otherwise an integer >= 1. The sweep uses the same purge path as `DELETE /traces/\{trace_id\}/content`, so the row survives as an auditable skeleton with `content_redacted_at` set.

- Source: `body`
- Required: no
- Type: `integer \| null`
- Example: `90`

##### `--trace-content-mode`

Whether trace and generation content is persisted at all. `full` (the default) stores it; `none` is zero-retention — content is never written, for every agent in the project. An agent may tighten this to `none` on its own but cannot loosen a `none` project back to `full`.

- Source: `body`
- Required: no
- Type: `enum("full", "none")`
- Example: `none`

### `soat delete-project`

Delete a project

- Method: `DELETE`
- Path: `/api/v1/projects/{project_id}`

#### Usage

```bash
soat delete-project --project-id <string>
```

#### Options

##### `--project-id`

Project public ID (proj_ prefix)

- Source: `path`
- Required: yes
- Type: `string`
- Example: `proj_V1StGXR8Z5jdHi6B`

##### `--force`

When `true`, deletes all of the project's dependent resources instead of returning `409 PROJECT_HAS_DEPENDENTS`. 

- Source: `query`
- Required: no
- Type: `boolean`
- Default: `false`

### `soat get-project-prices`

List a project's price rows

- Method: `GET`
- Path: `/api/v1/projects/{project_id}/prices`

#### Usage

```bash
soat get-project-prices --project-id <string>
```

#### Options

##### `--project-id`

Project public ID (proj_ prefix)

- Source: `path`
- Required: yes
- Type: `string`
- Example: `proj_V1StGXR8Z5jdHi6B`

### `soat update-project-prices`

Upsert a project's price rows

- Method: `PUT`
- Path: `/api/v1/projects/{project_id}/prices`

#### Usage

```bash
soat update-project-prices --project-id <string> --prices <array<object>>
```

#### Options

##### `--project-id`

Project public ID (proj_ prefix)

- Source: `path`
- Required: yes
- Type: `string`
- Example: `proj_V1StGXR8Z5jdHi6B`

##### `--prices`

—

- Source: `body`
- Required: yes
- Type: `array<object>`
