# List projects

## `GET /v1/projects`

Returns projects belonging to the authenticated organization. Page with `limit` (default 1000, max 1000). Prefer `after_id` for a stable keyset (descending `id`). `offset` is accepted for compatibility. PostgREST also caps a page at 1000 rows.

### Query parameters

- `limit` (integer, optional): Maximum number of projects to return. Default: `1000`. Minimum: `1`. Maximum: `1000`.
- `offset` (integer, optional): Number of projects to skip when a cursor is not supplied. Default: `0`. Minimum: `0`.
- `after_id` (integer, optional): Return projects with a strictly smaller id than this value. Minimum: `1`.

### Header parameters

- `Authorization` (string, required): `Bearer <token>`. [Authentication](https://spice.ai/docs/cloud/api/management#authentication) lists the tokens it accepts.
- `X-Org-Name` (string, optional): The organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but `GET /v1/orgs` (400 `org_assertion_required` otherwise). Pattern: `^[A-Za-z0-9._-]{1,255}$`.

### Example request

```bash
curl "https://api.spice.ai/v1/projects" \
  -H "Authorization: Bearer <token>"
```

```http
GET /v1/projects HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>
```

### Responses

**200 OK**

List of projects

Content type: `application/json`

- `projects` (array of object)
  - `id` (integer): Unique identifier for the project
  - `name` (string): Name of the project
  - `kind` (string): Resolved project hosting model. Allowed values: `managed`, `standalone`, `byoc`.
  - `description` (string | null): Description of the project
  - `visibility` (string): Visibility setting for the project. Allowed values: `public`, `private`.
  - `created_at` (string (date-time)): Timestamp when the project was created
  - `cname` (string | null): Region identifier
  - `cluster_name` (string | null): Resolved dedicated cluster name; null for projects not assigned to a dedicated cluster.
  - `endpoint` (string | null): The data-plane endpoint the project connects to, or null before a standalone instance is attached.
  - `tags` (map of string | null): Key-value tags for the project

**400 Bad Request**

Invalid limit, offset, or after\_id

**401 Unauthorized**

Unauthorized

**403 Forbidden**

Insufficient scope

## `GET /v1/orgs/{orgId}/projects`

The org is `orgId` in the path. Returns projects belonging to the authenticated organization. Page with `limit` (default 1000, max 1000). Prefer `after_id` for a stable keyset (descending `id`). `offset` is accepted for compatibility. PostgREST also caps a page at 1000 rows.

### Path parameters

- `orgId` (integer, required): The org id from GET /v1/orgs. Minimum: `1`.

### Query parameters

- `limit` (integer, optional): Maximum number of projects to return. Default: `1000`. Minimum: `1`. Maximum: `1000`.
- `offset` (integer, optional): Number of projects to skip when a cursor is not supplied. Default: `0`. Minimum: `0`.
- `after_id` (integer, optional): Return projects with a strictly smaller id than this value. Minimum: `1`.

### Header parameters

- `Authorization` (string, required): `Bearer <token>`. [Authentication](https://spice.ai/docs/cloud/api/management#authentication) lists the tokens it accepts.
- `X-Org-Name` (string, optional): When present, X-Org-Name must name the same org as orgId. Otherwise the request returns org\_path\_mismatch (400). Pattern: `^[A-Za-z0-9._-]{1,255}$`.

### Example request

```bash
curl "https://api.spice.ai/v1/orgs/<orgId>/projects" \
  -H "Authorization: Bearer <token>"
```

```http
GET /v1/orgs/<orgId>/projects HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>
```

### Responses

**200 OK**

List of projects

Content type: `application/json`

- `projects` (array of object)
  - `id` (integer): Unique identifier for the project
  - `name` (string): Name of the project
  - `kind` (string): Resolved project hosting model. Allowed values: `managed`, `standalone`, `byoc`.
  - `description` (string | null): Description of the project
  - `visibility` (string): Visibility setting for the project. Allowed values: `public`, `private`.
  - `created_at` (string (date-time)): Timestamp when the project was created
  - `cname` (string | null): Region identifier
  - `cluster_name` (string | null): Resolved dedicated cluster name; null for projects not assigned to a dedicated cluster.
  - `endpoint` (string | null): The data-plane endpoint the project connects to, or null before a standalone instance is attached.
  - `tags` (map of string | null): Key-value tags for the project

**400 Bad Request**

Invalid limit, offset, or after\_id. orgId is not a valid org id (`invalid_org_id`), or X-Org-Name does not name that org (`org_path_mismatch`).

**401 Unauthorized**

Unauthorized

**403 Forbidden**

Insufficient scope. The caller is not a member of the org (`org_forbidden`). A machine credential named a different org (`org_assertion_mismatch`). The org is deleted (`org_deleted`).

## `GET /v1/apps` (deprecated)

Legacy alias of `/v1/projects` — projects were previously called apps. Returns projects belonging to the authenticated organization. Page with `limit` (default 1000, max 1000). Prefer `after_id` for a stable keyset (descending `id`). `offset` is accepted for compatibility. PostgREST also caps a page at 1000 rows.

### Query parameters

- `limit` (integer, optional): Maximum number of projects to return. Default: `1000`. Minimum: `1`. Maximum: `1000`.
- `offset` (integer, optional): Number of projects to skip when a cursor is not supplied. Default: `0`. Minimum: `0`.
- `after_id` (integer, optional): Return projects with a strictly smaller id than this value. Minimum: `1`.

### Header parameters

- `Authorization` (string, required): `Bearer <token>`. [Authentication](https://spice.ai/docs/cloud/api/management#authentication) lists the tokens it accepts.
- `X-Org-Name` (string, optional): The organization to act on, by handle. Omit it to act on the organization the credential is bound to; sending it blank is a 400, not the same as omitting it. A user credential may name any organization its owner belongs to; a machine credential is pinned to its own. A portal session token is bound to none, so it must send this header on every route but `GET /v1/orgs` (400 `org_assertion_required` otherwise). Pattern: `^[A-Za-z0-9._-]{1,255}$`.

### Example request

```bash
curl "https://api.spice.ai/v1/apps" \
  -H "Authorization: Bearer <token>"
```

```http
GET /v1/apps HTTP/1.1
Host: api.spice.ai
Authorization: Bearer <token>
```

### Responses

**200 OK**

List of projects

Content type: `application/json`

- `apps` (array of object)
  - `id` (integer): Unique identifier for the project
  - `name` (string): Name of the project
  - `kind` (string): Resolved project hosting model. Allowed values: `managed`, `standalone`, `byoc`.
  - `description` (string | null): Description of the project
  - `visibility` (string): Visibility setting for the project. Allowed values: `public`, `private`.
  - `created_at` (string (date-time)): Timestamp when the project was created
  - `cname` (string | null): Region identifier
  - `cluster_name` (string | null): Resolved dedicated cluster name; null for projects not assigned to a dedicated cluster.
  - `endpoint` (string | null): The data-plane endpoint the project connects to, or null before a standalone instance is attached.
  - `tags` (map of string | null): Key-value tags for the project

**400 Bad Request**

Invalid limit, offset, or after\_id

**401 Unauthorized**

Unauthorized

**403 Forbidden**

Insufficient scope

OpenAPI: [api.spice.ai/openapi.json](https://api.spice.ai/openapi.json)
