# List projects for a client

Source: https://www.tracktimer.app/docs/list-projects

Find assigned, unarchived projects for a client in the key’s workspace.

`GET /api/v1/projects`

Required scope: `projects:read`

Returns the user's assigned, unarchived projects under the requested unarchived client. Results sort by client name and project name.

## Request

Requires bearer authentication and `projects:read`. The query parameter `clientId` is a required UUID. Missing, empty, or non-UUID input returns `400 INVALID_REQUEST`. No request body or pagination.

```sh
curl "https://www.tracktimer.app/api/v1/projects?clientId=11111111-1111-4111-8111-111111111111" \
  --header "Authorization: Bearer $TRACKTIMER_API_KEY"
```

## Response — 200

- `projects`: array, possibly empty.
- `projects[].id`: project UUID.
- `projects[].clientId`: parent client UUID.
- `projects[].name`: nonempty project name.

```json
{
  "projects": [
    {
      "id": "22222222-2222-4222-8222-222222222222",
      "clientId": "11111111-1111-4111-8111-111111111111",
      "name": "Website refresh"
    }
  ]
}
```

A valid UUID with no visible matches returns `{"projects":[]}`, including unknown, inaccessible, or archived clients. Discovery checks assignment and archive state; starting also needs the member's rate setup. A discovery result alone does not guarantee [start](https://www.tracktimer.app/docs/start-timer) will succeed. See [shared errors](https://www.tracktimer.app/docs/errors-and-retries).

Examples use illustrative IDs and data. Use the values returned by your own workspace. [Review error handling and retry behavior.](https://www.tracktimer.app/docs/errors-and-retries)
