# List the org's Projects

`GET /o/{org}/p`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `org` | path | string | yes | The org's slug or id. A caller with no role in the org gets `404`. |

## Example request

```bash
curl "https://api.prix.dev/o/$RUSH_ORG/p" \
  -H "Authorization: Bearer $RUSH_TOKEN"
```

```typescript
const org = process.env.RUSH_ORG;

const res = await fetch(`https://api.prix.dev/o/${org}/p`, {
  headers: {
    Authorization: `Bearer ${process.env.RUSH_TOKEN}`,
  },
});

console.log(res.status, await res.json());
```

```python
import os

import requests

org = os.environ["RUSH_ORG"]

res = requests.get(
    f"https://api.prix.dev/o/{org}/p",
    headers={"Authorization": f"Bearer {os.environ['RUSH_TOKEN']}"},
)

print(res.status_code, res.json())
```

## Responses

### 200

Projects in this org, newest first.

- `projects` (array of Project, required)
  - `id` (string, required)
  - `org_id` (string, optional): Owning org (the creator's personal org until projects move between orgs).
  - `user_id` (string, optional): The Project's creator; they or an org admin may change its repository.
  - `name` (string, required)
  - `installation_id` (integer | null, required)
  - `repo_owner` (string | null, required)
  - `repo_name` (string | null, required)
  - `repo_id` (integer | null, optional)
  - `default_branch` (string | null, optional)
  - `default_harness` (string, required, one of `claude`, `codex`, `opencode`): Launch-boundary managed harnesses.
  - `default_harness_version` (string | null, optional)
  - `readiness` (string, required, one of `pending`, `ready`, `error`)
  - `sync_status` (string, optional, one of `idle`, `syncing`, `synced`, `error`)
  - `sync_error` (string | null, optional)
  - `last_synced_at` (string | null, optional)
  - `created_at` (string, optional)
  - `updated_at` (string, optional)
  - `is_default` (boolean, optional): The project a prompt-only surface (Slack) resolves to. Per user, not per org.
  - `goal` (string, optional): What the Project is for; empty when unset.
  - `instructions` (string, optional): Standing instructions every run in the Project receives ahead of its prompt; empty when unset.
  - `paused_at` (string | null, optional): When it was paused: no run or follow-up starts (`409 PROJECT_PAUSED`) and no automation fires. Null when running.

### 401

No bearer, an unknown, revoked or expired one, or an API key on a route keys cannot call.

### 404

No such resource for the caller, including one that exists in an org the caller cannot see.

## Example response (200)

```json
{
  "projects": [
    {
      "id": "3f6c1e2a-8b4d-4c1e-9a7f-2d5b6e8c0a14",
      "org_id": "3f6c1e2a-8b4d-4c1e-9a7f-2d5b6e8c0a14",
      "user_id": "3f6c1e2a-8b4d-4c1e-9a7f-2d5b6e8c0a14",
      "name": "string",
      "installation_id": 0,
      "repo_owner": "string",
      "repo_name": "string",
      "repo_id": 0,
      "default_branch": "string",
      "default_harness": "claude",
      "default_harness_version": "string",
      "readiness": "pending",
      "sync_status": "idle",
      "sync_error": "string",
      "last_synced_at": "2026-10-06T12:00:00Z",
      "created_at": "2026-10-06T12:00:00Z",
      "updated_at": "2026-10-06T12:00:00Z",
      "is_default": true,
      "goal": "string",
      "instructions": "string",
      "paused_at": "2026-10-06T12:00:00Z"
    }
  ]
}
```
